From 8d1597618af8502f29b756aafd117a12a5db9d8d Mon Sep 17 00:00:00 2001 From: Carlos Galindo Date: Tue, 16 May 2017 21:46:12 +0200 Subject: [PATCH] Initial commit --- .gitignore | 106 ++++++++ .idea/compiler.xml | 22 ++ .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 6 + .../markdown-navigator/profiles_settings.xml | 3 + .idea/misc.xml | 113 +++++++++ .idea/modules.xml | 9 + .idea/runConfigurations.xml | 12 + app/.gitignore | 1 + app/build.gradle | 33 +++ app/proguard-rules.pro | 25 ++ .../newssarcher/ExampleInstrumentedTest.java | 26 ++ app/src/main/AndroidManifest.xml | 32 +++ app/src/main/ic_launcher-web.png | Bin 0 -> 18936 bytes .../com/kauron/newssarcher/MainActivity.java | 186 ++++++++++++++ .../java/com/kauron/newssarcher/Query.java | 58 +++++ .../com/kauron/newssarcher/QueryAdapter.java | 41 +++ .../kauron/newssarcher/SettingsActivity.java | 28 +++ .../com/kauron/newssarcher/TCPClient.java | 70 ++++++ .../res/drawable/ic_search_black_24dp.xml | 9 + .../res/drawable/ic_settings_black_24dp.xml | 9 + app/src/main/res/layout/activity_main.xml | 234 ++++++++++++++++++ app/src/main/res/layout/my_dialog.xml | 36 +++ app/src/main/res/layout/query_list_item.xml | 33 +++ app/src/main/res/menu/menu.xml | 10 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1723 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4208 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1187 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2555 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2257 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6114 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3509 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10056 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4933 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 14696 bytes app/src/main/res/values-ca/strings.xml | 13 + app/src/main/res/values-en/strings.xml | 13 + app/src/main/res/values-es/strings.xml | 13 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/strings.xml | 22 ++ app/src/main/res/values/styles.xml | 11 + app/src/main/res/xml/pref_general.xml | 22 ++ .../kauron/newssarcher/ExampleUnitTest.java | 17 ++ build.gradle | 23 ++ gradle.properties | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 ++++++++++++ gradlew.bat | 90 +++++++ settings.gradle | 1 + 50 files changed, 1519 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/markdown-navigator/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/kauron/newssarcher/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/kauron/newssarcher/MainActivity.java create mode 100644 app/src/main/java/com/kauron/newssarcher/Query.java create mode 100644 app/src/main/java/com/kauron/newssarcher/QueryAdapter.java create mode 100644 app/src/main/java/com/kauron/newssarcher/SettingsActivity.java create mode 100644 app/src/main/java/com/kauron/newssarcher/TCPClient.java create mode 100644 app/src/main/res/drawable/ic_search_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_settings_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/my_dialog.xml create mode 100644 app/src/main/res/layout/query_list_item.xml create mode 100644 app/src/main/res/menu/menu.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-ca/strings.xml create mode 100644 app/src/main/res/values-en/strings.xml create mode 100644 app/src/main/res/values-es/strings.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/pref_general.xml create mode 100644 app/src/test/java/com/kauron/newssarcher/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4d8cb8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,106 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild +### Android template +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Keystore files +*.jks + +# External native build folder generated in Android Studio 2.2 and later + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..57927c5 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..25ce2cf --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..35400b3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..6dfa63e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "com.kauron.newssarcher" + minSdkVersion 16 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.android.support:support-v4:25.3.1' + compile 'com.android.support:support-vector-drawable:25.3.1' + testCompile 'junit:junit:4.12' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..042e5ab --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/carlos/linux/Android/Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# 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/app/src/androidTest/java/com/kauron/newssarcher/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/kauron/newssarcher/ExampleInstrumentedTest.java new file mode 100644 index 0000000..ecbefe3 --- /dev/null +++ b/app/src/androidTest/java/com/kauron/newssarcher/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.kauron.newssarcher; + +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.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.kauron.newssarcher", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bfdef95 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..92152ad7dca56c92846ad0beda50c0a6e2e5578a GIT binary patch literal 18936 zcmd74bySq?_b+_U&>$j6NDQce5>f)9w332!H-geBoim`Qw5Wu1cStugf`};Hk|QXc z(lztm13u61yWX|l_nh-P=a1uB&J50V?`vN>KYQ;BL)BFk$VnMU0RSL>s3@xm08sEF z6d)!9-*&u*jsV~x@}cZ~ZSV25W-oW0h5E9_-qX1e*Y&!ENw3{!i?Iqy8_`|3UT= z5Db0;K&5fV0Z;H>y!^ZR|HStHMHcwqJ>q0noF?ExGhu(mAYXch<}!v2s0&jGAqK7y zgQkoC<@e$$C{X|k$}SlE3H%I|CI){3KmYd^;e!GM@Xz>%qR1Hmh%_iJkmlJo;J^R- z<@tV>z_sTh|BrXvGxz_YgAe`$e#XZc5d;+e*@3{t|Lcp00RonD3c)yM#!29e`2RnT zXVUuL5Xk?OXz>xj(dTl%51#Dol)-?z#YhN40)Z=0I>5pgXK!9{{inH3VXs~`m&&%|fca5T=i{vUpQ6@2RdYw!PL4G}-6&!Z9* z5|z%|Tc5UaG~CnzYah9N#s`9~Prb9cUxT{GbA7?E<;`eq)|mEdT!_H&4*oso9>*HU z7>=d$9naqWz&eol;{ck+-5BYOpob7lOFlPJ@>i@yQnZW+8`G5a2&Rj16Grx8B z^V}z8XVJ3UWrKN@}Wd=yhwJmu9hBHog?RADnazZIPE64R{D@E{_2*%XuvSW!X z?vcyKHv?xX!?#}PmPE@7AtI(K$yqQ z&B^ezm4l5ywvlOG{ctn3>7 zl$6x_3Rka-Kf-%^St#J(>M&1NmFZ~k-r7|F=OFmN?p5VhNAc#yE+Gm zJP0EGsvMnK;;*3Wwx)C1c9f(3M(oW_wl`1GZC$^STm3mIImT({@urS>a1=8+{y=!X zd$j8Db84ywkiFNb(2Q#g!s%spbXLo!iNX!#k+y%$+gNDQnPG^D!`M#BF?T04XVdqp z)p5E3qTYVk!q4}mJ>40n2!$`=DybzVS&0OdSJwA4cOg&R@|IeUEadUdjmu_X8IwCQ z>r8v7!tnM!9t&Ta!zU&Yev@u)x^k^ENkR~>X2!ih_hL8DTHC9l*4}7Ou2fIB*Pi<2 z=Q!b6Kt(g&)2@0nN3>hpTb=j%=*uS=DdfKm+uuwH^S?#I^{&m%^zf#^2eqT@- zJ=|pyi8xCdi$eYt<=Vg9^0*}grbTL++jlfHkwFan7QrvodIsw5eHZq47;}5uUZ^bJ zlO#O=~Uj+l?%sf(etD8``uU(xYK=~ta%#ekyRa!#6+#kEjKq| zi)Hbr5s6Q}KhSnyNqci+P%xd}ts)>5*dW8lWmQD9TcAmd()^>{Z?n!}PTsQbO;(Ab zJ`@UkP!@8u4Xq%(W25oglg9`y&0U+Set+8_cJ)-B=2cn#(E<5za@`N7!f1Huw>CYU zhK)>8FaPut$Gj^4w);kx=4qXVc5-qU#KaVye^IT>Hh+CR%W`;vEC=PVYbJDk~O-bkR85U;Bf)_)Wy}|tigK%L>pZW^r+OhV!^uvInuV&TZyIItS z9iRNCgJIUOjazSM-wWHwJB6_0D?17Z43bc42$*g&b%Xo(`SB&591%Q=-UA#ddcc%kJ~r6B9-x&OAG2r+8sgthMUW1PLIE#VtT9c?Hc8K4IP~CM?{6| z<-dZ}P){|+TkZQAupFK;f+-n?dN%Js>Q?tncs90zsl*pMXT-M>Z(?2yx%&|Wtbb{P zRUmq`__JVECDKY?_~pJN&~~M=LN(&>pX{GB@*0d%{zHWdQrCZKTe5s;%}zk%+jSYP z@BL!--Laj&Zt0)e)Ws?}tSKnGtWGkrRc5@$lrf&$*VPW{Lv}BY3^2oog^||oj9~o2 z)dSu&KmwzOZL}2Ey}Kxx)EhF?jA_LJm2oz|=jW(ToXtJv#1a!y$|N7!G7oE|=XW4i z4EL?Un0Dq5H_4=R&>OLf*VHgE0_6;Me4-?V)PmsNBM$IUr)N*(@x z*{@Pt;-fATq)Tp&dTvo{A%Y**Z1WUPI`OR+NqRnSo$g76{wCtH{c&{anRh>WvAa)9 zF;*gVL);#EjuK7#fA>-$rXbih<~@of*kndX>+0{c3Y*A3wJF-aV|qCjqq`OgMSWF5 z#H9MVnv~jau=#wZ{Zt)#j_AkQ!h@>2M1&QWTAb%XI zQhIgUNH1a3-q$X@CX7rf{kXXqbxKdk;t)^tJLEl>^GTDq zpHb31=~u052x6wj$6mC_ccskw%eVGszeSDH^B0YBi!NbV&*C!(^f^lP+h>xOnCWPK zJf1k#Jfi4N7G7C>?&H1e#VpAF=7U*L)u*i0=Wj)=xYA$g?j3}KI8pKp&LIHz&+o8t zPq&B4o=5EpHy;y4BY)H9#MUUaC!aVm#VMwf=n6nv0^q}*>bIyugumb2^?txm z=G4f{jBCyAjNn^yOu)8}_(RgJYciMTOFnv;xqlu(b(xlp5vg7~*BhcO*~lpWg#I!O z4dwctB*rzAlOgFt)^Mb?=*bdhJ=i(yG}W!7{rI5WNOZT8C#Bw9d86*NR@!t0)`XRE ze%ql|GVQR*@qxNuMHVAba~@|nDRtUF@2LVY5fN9}0-5N>{;j`yy4!AT#8vgUlPQP2 z&TD#xPI4yFe{-vao4DpbAZW; zn2US5&FDQ9Gu?46h?5g*GV^L)A!;GOp6jnnA0D4lQ1cFd{)9J)`Nfjnxay#*bfF{Urip~ zgUMSE5Q7&8Vx(mM+K8T;t=0$K-sEf-kyMzoYK~z06Fb#%rTu`_X##)UpCTbuOU)zq zd;~9S*oI(DlWSUfSmQ1v*oH=08zQ3(MU)V>3_{ksqP2V%9+6(`TV{s;NzwQlFY?4s zMN0J3e=Zd`Nw)Jn9E^+8m;0S*ly;!ykXfKrAB#%{P0n+WY|ZwQnjU>+y}D;i1TeP%_tH&lM^%(ueJ zG$56_<|&MM1YM6G7}$^0?y=}!#wLvo`hU}nT2!%K*c zYw$1l?H#gU=W?RT$8gx?o237jrNh9=v}y6(v~{+2?79h_6=TMSb$%nFsq!1hd3z_NKO}e-BF3r8P6xZ0!t-3fQ+06*e z;w050Wkr?I3XfwQpI?FsMth05_pJD^1!`hmTgb-m=$~Y@tHPI5`KXL*oYLM75dDZu zVM-$f3!ts!f`%#WwnNx??De~=UiV1mIJfTU`i#(Vr?Ej+SeqUbx8zF6Y|Y&Bk&*yw zjuW#aD*lp}Dp^^P7gb5F)F*w=D;Rr0UCTr>#aA8;RxA&|WPlUftM*C$_(u#Sb&DLe zLdW!A>IvIV_HyV?Tl!^vaeix82UBXp=g>fs7!ngzeF0SNmnXdC6dunyzP|nO>6xVw zO$aTR0Rf2j71g-1K6DjZ#{#BX-Q^o1!?6B$-CR4evUk5$8QN2QhvJzMw5!*zZ_Ji7 z+TE1@)sD&tSkrh4a)rD#fY74+Ua+)<-Xr3(8>Ia7fac_GHR- zNqGx?0)xs!N5rbct~w7sCTA9rdHnNdlrpM8uF~VF+dTrhv!mDThr)A~(~{8#lgNOt zYO0~Ea_tUJvkn?-+|qp{QbbL?dlGk*6jwG*Tt7V@*i{|o^27&GFxacv7u_o3@_X6Z z_5cPy+K}>34)aWL^AQjzapc7GI9wLWV-@Yc^|i{MS;D^Dr~%)}B(=oeh?}$F{M=Li z)9N{tO9fF=X<_$kr7eD2lYN6yqKbdq_>wH%R`dy3Z|c+pLQD>ta-02`B=W12#0Vs z;hsw|1xlSuhH54qK&v_?r(YWbz0$B_5_x=tcekIt&po(n!u|7>1_CTW*G!ueTF-ej zo>b2)7HDH?UXquUvwyIsbj;aH0vQXeX`e2Y5Avj#|Anf)_z3Sk>_Gd&VfDo{sw;&R z^@Hy9EfKRg0)0LNs9P8@)405Y1e;e27zMk>a_=l1pQ=*DE5aSljP=2?Ya3|T3hSUOqUTd3r72eTFFywLD9($ zlqco6eB5sS4C&XrB-?RDl)g=hIu^DU@=<)5C1N!AyPN4`cE}b^Sa}*vfLNdF^I5=0 z-J8oa75d0pN!xN?&(1i#L@|_`!UysWzFr;!qjL*(ZKQYPV3{_ z=#nKkKYH)`M0Og_E_&3vv~r}Bn8-ln!LYgL4>gZcC@~Wq{ZRrJaNQdz4U>t7(I8kI zAUm9pd~tuBaC=Wq@z#3Qf}7;@>3DMAIZ$V6Q3E6m^|EOOJH#4yofoh0m^AkG&pPw_ z4I1E~zX$^tRUs#q)aJcDITxAM$ErWXBlbxnS(ZrZcfj)K>6U|?fq3>g2xVjT_jUtmTzQ*Y#6d%PD+E8{?pK@s*!CO`B>O|PXXaTpW1fC$(RH_6)yL4Wfu2`iCiRdp}=SUlG z3R|ONXQ>*OrG}mVYBufG?@PO*ft{m<#`!>WzGuJk1$6hTZK*#UAaQgLhkbY%<#=cyPAyLY@MtJ-> zIw*_b74KcC6Kp#NN?678<9PWtL>}KmLkq=smaq{$tU$+iU7PWb_oGNr!GGj+nCs{7 zKx}Hl@@}ROnTH*$Qy5kKPT5OKwH{w}Drft2a%#y^>-`?M^3XMteDhQkk9WpJ{aQvw zlyMfAhznP@#Lv)HpAWvdHRk%Ra)ej$!Oc91k+ANLN!=6j+^@c^o~SI{Pfotr-0!Mg zf^KWM`wtB5F2Eu*zVtZdp8v*j0_C222RuJn$;6D5CIEL^#RK0Pun=W zy|Pf|ad150KA#(9Y~#A3`0CL3xVIY4)uz*Bs8RA-(OOhjb!9gZ>=|DKUFQ<8835rY zNBqgXHwt{cFbqmZdbp$1OR=1vV1W9G7f-ri_+Hn7`{=uJ$_s+u%oADaW!$?~7JEYA z`xbJi8jVHSmq%CXOr4k0v40`e3>`vH=P*&k>4hcqQrfs#5#!9#M~la#W>H-DOAJc1xFC8eK zNffnDfOhG8rb2(GPXKa7JTTX&7CYrk6ENq;Q(}Y%O_}CI< zc`^B=jXYgf0bD-UPR+9zxN=)wMOVLWrI%2VVo%Evy>Si#L5@v|=E6Wv}F-!d*4 z2w?H@{=`pZzBiJz1n7~+CjH!G-Q&X2#+Ur@lDnM!MQkRoNFJ{XS-Ful;z3@0Q+)22 zNs3P`roWsQX?poNo=)GK+P^9TqqjmW(8FD-SKpS0t+wt@=CrWN$GGbDCgrWvSV>My z?MHsa(PNw*%w3pkJ|KW zy=yG8lEtiq%P_ACMQtGHQ+~3sM|g}{lj9Am5<~Ac^Ge7A9%%@hoZLy>E6(&T)1Vl9 z+UH+3k4k;M;QZqhZ{107@`jLONoe=J*RNI{*vHg^Zuely(CV8K8-9Z1L9KSeC!4B3$n~FIQnH{wkaX0b+qF?^&A; zd~@_7C)bo$OfW$dze|^Ph(cZ9kzFx6a8rCuTlzd`a{H87RnJFzl@g&AKalBw<#8Cz z-PZgiGNvCS{Gy9Iux+fsSrkDxLR}hen;BTXymte5M^~b8_~|<}x66yr?QI%ZJo?Xy zr?xsBY!6HF@9Ip45UWV0*#w}gr>wfMMxz)-V)ZMI`_8o=yRY;Npe|R@d4COw6!mlV zcjB@+9qKS=LL0=-AP*yC>1uCRlJvF{%P!pb{>`#)5R73+ryGJi z@4)-(0f~CN?mJ9~laiZat5?i71L8_1%09Q?8N(5=>_8+0d0zQ}3&D|#y`o`-CG?}! zv0of8nXVti`pZfD35oQ}?`0GB?@v|nZ0h}cuKA~Ku`$Vu2>`WFn$E5(K9GD3Y_PpO zst=@GNv~6Mgw3cKinqGiY`MXD~F^wArPSKN&CEI6fp{2^#p9QZwQ?M(sZpT zpi4`hlodb`qvB~Hdn)Cl9qJJ{&HHm#+- z4673?B0w3U+ZusCbhc063!aeTN#6%Lt5AS%f`I?Jgw8SPGmbAH=K$yhe!6`9V-fB| z#{g3%1#owa$UKiV0FXD(^w0OEZ^r=>)GILvZK5gy4@5vrqL5%ZPbiZ_dKp;pX`b_Q za0@}z0|hoD$*%SURRUkEb_P5D(186d00OAu`D@?4M}DbkQwX*7e83~uj^>=G7XkXw z)0T=a7u+5Jxwp8~|I^48jwETdURo`JBY`lSO(HgMz^X_XenJeI`cPL0m)Is}J1NuS zp`F99h$xRk4>7mT=2K(34+U_DXww98x3)$-{AQ%*BY-gKL*_sL9j7ju7*9b>Lti#q zx$MWsKJ};3j2RQu7C0WwXc6CcpMFad=of$}DzRk0m7wDQmvf%J;$UO@oHOe1=*f#X z6?)}sXT%*Lb;J5uVLpR2%d<%~j6Y*ExW+xAEC_h>Kz!DoSJ(1N&cY#r^!81y*Js)? z0xqo3^=hOoDq71!Zk2zXa(`hZjeZtaCY4?%J6c=5p46uRLQRg(XA0p1$m_RZ5|l1Z z8qMD*$}a=P-@%?3%~Z$k=o;!h8#u+uyo77M9kc)mU`jvQ_jm-{;L*={+svX>h02LY zOIrAP5ka|RJ08>f5P>6^A`L{n|7AD6c|VE-g?1IxuG^Lgqpf=%q4AEImiedeW7uu! zj_-f|-G4*7WB?pG!Y%`q>h>OkV$?h?^ttu#@8Ml#V;lNCx{};4v%5u@2;dqA?odeG z$5KV^JT;d`z=O8dYKPOnC<4Ox7(KXbjDRaIQdflnk@K!&(MpCUw}XwrZwWaObkam8FNx$)+lw-o7q1X z5ibSkPpkZPslxa{bCO=5L|p#OEj0Bh1$Y@kqq5hXbe%9-X?Kh9+l065wTzw!-EOA1 z3@y2P196(YmVbwnsNG~Uy= zgpjMCve48-r16E$7AzegNS+WyIwVO%C<{FIlsaW;ETu_`<`fd@idk{9>6@@4JzzhJ zzkP@JI7iBYLC7!9|1NOpAfguXelaf-;O-AodEA z(c`e|E3L=2>xfY^|LiIsE^qcLytBD)w}heomm^QD$N+wIP2-3xDt`ZO#=o7#9zK5l z3Vt*LwjR0+S0{sX?oSOdZIbo2jGkY2N&fYG9NK+FU`zv|sJK?<)1JiXu-O-meI~-J zoAyhnqqMUtwQTVPHu`*m*uxFPuYA{TKxp|z*)|O3FO_J1uPa(b)R*$2SI)JV7>>Q#tp{mql=#Fb<0)e z@HOIt5GTK*e{>>5C-UBAee7oxsq_=~h#Or-86aj=UqrW@m!2M^P7`8lsE!OM}^8|$#d1)@9r^nQ=3hxE%D%`pYe2I!~Z~FAIU=+?q4|Q(T zSL>rI2LW*Q!XPCQ%@gF3_C+ebBoAxYQG=n^490T@)9AEo+5Pk7&wFdMZI*tOgIrA* zBHD+=IJ`Hj>#@HXFNz-RI42CQJZ)aU;+yvWpQMGzlr z9iWvR;d%4#IoO1{`iHT(hrLgoul&Q0pMo?t8^447YPs{v3gsI012oI6f*(17G97n) zry>`3Ye4Yb<_wQz_?9LKdg<6B9t4i74Ff4^4;?t_gc z8osgo(E#{N9 ztd3KqFOuxnh!P&~_I{uRz!LbCJ^19sMjS_XdU zZ#=Q5Kl6t4xdyxjd+PL(`)}^u%AeiT3CoGDsB$XPB)p(wqhFUbstKmOslm+3COus6 zxCF$z<$KqEA%9exn*U(xIs{Mt(MP{lJ?6uR;3Z4keC;fu{9K*Y9Q&mMa>liJrQUc3Y3TmPv28-=12P<=%X)_r3yyfJbU;D=QN+@DXbf*uvo` z#-%M{)ZDW|iyW(nE5(~1)oUN3>WY6GPVGb$Mo*<9d=EL{xxcr6g%qu|r$&{rmzVZ~ z0e+`{{5mN&7=yq-N($DjS&&W=r^|@V*BmMa#`&2hEER&N@U#<^%Cs(>YNvXuE(;wu zu(nN6){p~_Ck@^{@yRsg56pfr^^r9_a#4~b@q=qPCFS3BH`xAO!#VKt4$@0-yx~sw zhz=>&Idc}Jjs@DC$pvA=6mD7gFF1GwbOz&Nf5?T*E)z&#D2xZdE}&K$E&d|MMG{XZIkW;Rh8{rn%Ez@9|{IqkIr>ZRR6I>Kcq5`qj>uD zyV+lQOzrr_-1m3;?hx>E2pfQK2-n98KDVB`oso{Q<9cth1n`bLzN$!FzdbIg>iKYu zH_U~o!r}COWbz#|fdDG8U!rx55cMMbt|x4`3l{*yB@v8~`Ct$}y0N$PCaL9~`i+3G zyWM2oUDnD6o^HLY$fH-6;BJ!rNsrKYzlW z4T^AgcP~Aw++JDrSuC`CjhNd$73;AZ3A5XU-To%|<;UeP?9?EHo-?%2u>?M`w$=AWG^QE`Dn$EJpEeGz$epQ0= z{t9h(jY5HU8m(f92dR$67NEwJZ0I{1TIWpE#{h1X!YhymV){_30YaNUt-{|X++}|g z*)r|i)n=~G1@B%62l#xT(mb9>p_gbrn30fp5>@WhWn`{K)W?45T$*o|2?R@SmepO1 zM@)|_Y)Dx&HB0v;%b9^y9I3Auf7VTQKVE&c(_^70Cy&ZFkM^&#ORB1H(_V+1JIdhu zCn`E&yT69}2O)%&5{^SV1co(E$N*83-Ev0i180WyT2q$Fmlo~wa|~&*_RWDLrY0vF zPP98A_?yh<4$5RX+!d-67OwI76*VxJI^tevH0+)0k%!vqK4kh=aBW8faJTy#{pI(U7}qr9P|4~dwx76Y)=vd5&h3@zKm>qb2KVOA<&H8-r*hmt@^51=<%NP-|z;wL>p8$Sy9^G@cxfRs2>5U&*CA<0Lx;d z5-r8eei!8y{y;X{;UTGoT-D--pa46+32xP>hfctofB zzIK>U@pI%S6++YYACa6Fz21#LRV2RuuYG5(jV+>Gvc2tt*-MnLtQS=nB^FU#*1TRl ztH4OGGRg-lHi?GCc(AwclN4pwv+Tj}?n4%)t%Dl`BbgSn97p@2(qG>qKE>f{`(}cY z#$7@6zYkof<&oU;8)5eBCSG2bkh^~Sn<-m7h`n+5p+KN6RO|9C&iQVB<`hf8k$1-~ zEyr|#X+0waccXWBE-&Z6SKA-UQWn7`JFHojoPXBd0MU$pIX?&ks7COoZwMCW&@Q%6=h<+X`%2Lo6!LE_Z}N$v^ug0#|sC1N2t#;6)kt zo&B(d&x#hm++drqCn5xIIy`=7WxrG0UUTJd>e4YL8~Kd@49<2 zJmt>ct6gq;Agr<<`Nq)58O^z4X|-T8_Um4adqTZ`rEZYLMprA!P#Ie48~l$HHGm6g zhZ0%cLCBH(bl#T64RIlDN{#-JL7%tHzkA%r1l3jw@Lm;dpkrvWR-t$SU~-V25813Rtb&CmxN5BmC9 zMdR?Z366`V-wxVOrInAC;u>UN_D6&hq&vEzk1nfa0P(kYfue1IsopJlNe)x7u63nLa89U~3`qxGH>yl1qrf)&4 zMA4P&y=UAZ0K_|}`9ah1;P|BjBR}|^_Mu~b*1MPenlqk5q=pTU8}`yJUS-TA{Eo%7 z_$S{2z;lZ>m8J%60uWqn*!O`TT?P867r}~=>JLuk;~E)^qJ7CH!OpjF7_54TRUAeB z$#%FHB1*Yw8A~>0^O{r?9MDLxyL{R(Si5jgpS$lH8@zHq zp_)OkB<-Oknr}_FH+O8NY@_WbBF)CQFKLfDs5T(&{-;mAl}Ty7O@|G-o~I?1e~%*# zv_$w+h|gh@rz(cy8;O1KtjbO%P2r<8D6=05l1VX%uPEzJ!7JLI(?@wo7JuusV|Se} zM{V5BOSOE>*RZ3e8q*UOm4LHo20-fes}T3pP>;wGb|G!S4Fl3&BNKM7komRbzeJcV znJ9lLJ*;+qJQ*nlyLxlqcZypcy3UJ1`fhog{&6l_sU7J6l%da3-k$3k97Lm8U+x>W zvmraugs(3;%K7wb<~!2vm!>dJsu%S2(HLnFcZ3+A8w(4Yq0|F8KF@Kyg%h;px_XEThi@htv!M% zK^Ugx*E}CH2+2J__VY;h&SV|T@PLM69#S;=*Sjtu_QFw72s4h_1+p6A&)1;Qvf8qB zFWVI+WKNCn;3aN>GhW%3Q)3V?FL|iAt?1Reb+yxrPBhr~4YQMtIK+BcbD@q2e6E2f z_}s1V(fxIc`x1>ME>6*Ot2ztw=^4a5R}SX$PW#l^Kg)yTfI?c;D>*MeusUQsJF*_W z0eN?eWb;K@jL#qVcRqDwZ5URB2Ge*L$qq3w^;3~Efv+W6-9M*YmR_#JFxJjmFPh&N zbz!|E>@i8Agpdh%XMscD&dXr9UcXvZ7zS)xsxV3_7Fnqd^_<8Zxmy-!$1l{R4OW8< zQhW9M8#^lMvikZRG}v@=k1c1jE$6w>IQ*u)amK<`45P`)exehF|4P5vJ0AA)U0rC> z91HqVhn3$;S!T-bsc9iUd$-HVgRQu1Et=EKk0UovBYw%MFx*B3N_gtaVdu!(VMp8b zE!6{?S2UKd*tmHx4w1cft;Fppcad?4UMe4XnvL}8rZOoHdw=uP!O5X$ z2-BLw5R+;Zt?I3{g-nWXJh0X3F+LU*9A(@P10fgKGsQdnSSoE4Z*BkMz3bjr=|3>~ z*Q69)_LR>|K2d1Y?Rq3-ve3bDK&;%&Eb*wCOb~aWpjt@RZ>M)|`z05Q*R=G0K_{t4 z+hW9r?Ty*iS*#ApM+K;N+WB>z)ZY5)kiA7z1*fHOv00djVkB{b#gok{&gXB$%;FCj zRDPS zGF%JK|e5B#?xF6H_{bou$73NcE}%C zm?(5_oBcL_JEh>;XsJ%Pb}h%C>7#h?=KU8VwHcX#x3Q^L%ChUO$SKHj2nqd)p0!y0$-{ zqFfei_bkrswu>T56|L<@7oW5%!MIGF$~>LF8KuJx$*QfpsbIGZbF*@MM4z5wy^8c! zo;N^`HxiJ}7#=~=$F!>-dLK*1Q(oGx7i*iWIF#(Rx02AJ@l5Ca_84$D-}droJ*$(C1apzOeau0aAKrbO7|VTHI2m@1b;m9>YOBr zw-!dikK6f3mhJ2+IskaH|E}SNMEY#Aa6l;BvYi#8@bPz+9m_}-yU6eg z7ICQ@Seq?mhmgnNCyadAH@srAcZfWEqj2PzjqkoenLS*2!^@B)JrkG9fhsd-ai*<2 z^vlIZ*tht1r+)ShH{wn2Z4}Jj8x(!oA)qN805+ejx zrS*>#Cg<~(3V{B}W`6uFWDoMd`FMY`a2DIH(ds;=K;rBmCY?`mmQDeH;3 zcV*Hj4YrK=sy5O+_4L%8@E>->t-hlfV7#4Lva;`+>w4(e(gm5=AIT|z1_XFJI2lm6 zG(3w9e$cvh&BHk!p>oeH07HHMoJWK`TY7;!O9{7b+4N&4vDH^uFU~r!;I1)d7c73TjyRg?w`YSI~{apyM`n-Vq)eY(XgwsXQy(`&3J2{mBo>~HrZS4pV8Z- z$}^QV5XCE{{f!$wg7mA$$0s}-;S4_8KpIzJzfX$87c!uFv-d5n$q0&>=7O}`rjkA* zhHDwsDxzw5r8Lc0-T;EIHyd~gBwGFFa=-^jY!=)RX3^#)D3+Ypt z=i)W_JWdaI?;_0?`^0DC@2PN`F1`_lbe5eMz&9;O_yeG(8?^a_htocP#fNL;h&p&l z2eU(Zkq3!%UKboBl)SZi#Qj83Nvf3DXO;#6OzBq-QPZ_)T3y_Hi(aO;AdW=Dj!t57 zA4$MCcwVz*2*fD7I>#-I(T&193PnWiKNf@&4+TAmx8}lzB0@xsC?V^G*$Qp? zK=IO1*Yjh1^?&4q%94lnxCiJy=EDvb(Gdo^zTec2Ub~|BuZ*LOF1!3%+n8ts1s0xe zOZ!BWur%?Wfu6WJG#}@HpvOSbRc z@V(`lPxC;=*Vi^BX2~IEMe~_XHa}AJjr~?o+Wmv~0<&YNm&1Oez_$H5Xk=g@J%i4B z$=4I++o?8ZjRF~_rA&@V<8XQEuR^O7pf$b)_*FF6X8X9?1UP=q<&qVJpY7YP(F$+W zI@t#=Md2Llj3{aaye>+j_$N5)1@_3wi(E~l4Wqn-_wSPkZnpIL?-Xl1!Kvdn(R^iI zgMB-JqUu%2st960TvY90k+u5j#!a9f85ET+Gy$5w&c(6~JeyEV$)0Re`XT^7UEgr_ z(cZ$&6*=20B3nd_->!7-M^Au;joKzTh++o>Iro4~c0&gH)$5E5v;{LwJGlzf*cs$W z9AQq*lI)>UG%se{)GIP93h|grkze`NIwyA{=-<@S-c=NUp z%n^P^E1ut}5N_H#d!&e&LAv5h_oUWU`PRT2G~GX~h=BcHHS7>DUR1EBvl5uQ%(OIo zY#C!T6;uZ7qBZ&_B%qt0U5hxTGWi=R1sC+h;~8Oq|C}OtFH%|=DrzB$>Ngx+d+chO8Ct$O$5pS=!QzLEc?&;51-Y9CU6mohvbz4d& zW+Sq!Unl$tmv18-M3T~;CWo8aO60Z|qN?BxBO_2H11%g*Mk_=3;vPtQ%<+qoSWip+QgN1%O!@T5}67PVzAv z`6_jJ6my7epwa%LK!jHfuB>GrcL3-E)LH97`Z&kP*mpwL40RJtzLW`9$87T?$f6$HTcsR{`0okAx4D=6<~Mk zn2zgkt{R{BiCB7Db_<82`2h=HjFjuUu%I9>KT~U&PJivIqRMc_tg+eAw3Lq96cyKj zxf=(*qkq zx}K`E*=OtlK*%pkOPeboXk$4s>>I*4?Q@&68Q82KlAUsX~iTzXqHul@vfCj>u$RNa?uYDrK2%CG; zRR#*Uz#50UW~GP{p%SOquh>ok2NL)GN%%o;P6JKTV+de;-))V2E&u!Q^f)}%LhKp@ zqjqFOQ2gOKCSm8OMd(`ab2tDPcLc5#lg00_t4YV$4kcVuA7EbN2kI&L zJuEbC1%K}yC7fKFP`DaqW;-keUtzaNH?bc~AWO7# zoI5l8J5t$6+KJt`L<3g!_bwaB;^7dsXkG1A z?&i#6b-kCTpi&-c?cNn0!pvwJt6fIGkMgkQX>{oQ&zY)bCqy$Jww;U5s1(j3bN)yT zE{|%ln=eY8s_iLCueeJu7+>bk_Ost|&i{qms_-5>3|Z?==KsfR__QE2rBvfmI}3n{ z^&dApS-~*I4kxi)MTa_fZgd8E9pP6U?Ac*A6fI@4D+s7T&BqHJ7D!k+?^;$PML>{R z7%!Kj7Dad<#nXOjn)r@ahcA|)$a@Y7h&%b24gTyEI((dlj8{h4&zwg8!S1mPorW$+ zdLY!Jt#g7*vYSFR1Ij)6M>f9@0N&!NwtiFYgVXUB;Vo=XFl9TbW#=Dj3F|^mzZQud z?;d6e2`F)Wn+4CXd5~Niy)$K+)cQ$MvXK{UhJDu%u)wzmy^p+EYh=7v_!ILnt(te| zJAHRd3jjpV^kQG`x+1$m168W|Y z$A_KeE41&ViSPiZxzhC+(?%n)VMk=l`EaWuA+#|R_B#Ztd- z@o8P{M*f7B+(-v2F7S_ZDAT4HO?n!XgTHS@dQv*{-FJZEu$+3!jdPC2c3QgNhMt|d zG7BIrW?Noo=lW?@!Y>e6&#MqQEaC1w1>FZ;2{j}xl(YawmLNW$M>0Q+A{C>wD4d- z_au56x3Xsgk9#gRbN&(Gk*uu?%tM=1>~A=iNo2#SxvQIROqmXi>hJMs-=1Z-ws^D# zFMopWUB<{JpQI(*k$hq(`s!R67+@TzHsg1S;M}uPoGG48OYLh2hIij8NRRAt&UM+7 z;a?yNTUQtvq2L zhSiLk98z`9XPI2!S#Ei-W<4@fFJr=;+tHkHc+pd!6AAiomIF&G^~%>w9$V$etsHl^z3ZKv!yqbE#3;ntkP3iJyuG upRIL!t&S-Msb27Z@&8hUV{LREOXPR)LF}ZLya@pQc_^nUTl&B}`2PXo%}s{@ literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/kauron/newssarcher/MainActivity.java b/app/src/main/java/com/kauron/newssarcher/MainActivity.java new file mode 100644 index 0000000..957b2f2 --- /dev/null +++ b/app/src/main/java/com/kauron/newssarcher/MainActivity.java @@ -0,0 +1,186 @@ +package com.kauron.newssarcher; + +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; + +public class MainActivity extends AppCompatActivity { + private EditText editText; + private CheckBox stemmingCheck, stopwordsCheck; + private QueryAdapter mAdapter; + private ArrayList queries; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + queries = new ArrayList<>(); + ListView listView = (ListView) findViewById(R.id.listView); + editText = (EditText) findViewById(R.id.editText); + stemmingCheck = (CheckBox) findViewById(R.id.stemmingCheck); + stopwordsCheck = (CheckBox) findViewById(R.id.stopwordsCheck); + + editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_SEARCH) { + onButtonClick(null); + return true; + } + return false; + } + }); + + mAdapter = new QueryAdapter(this, queries); + listView.setAdapter(mAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (queries.get(i).hasAnswer()) { + Toast.makeText(adapterView.getContext(), R.string.no_answer_yet, + Toast.LENGTH_LONG).show(); + return; + } + + LayoutInflater inflater= LayoutInflater.from(adapterView.getContext()); + View mView=inflater.inflate(R.layout.my_dialog, null); + + TextView answerView = (TextView) mView.findViewById(R.id.answer_text); + TextView shortAnswerView = (TextView) mView.findViewById(R.id.shortanswer_text); + TextView optionsView = (TextView) mView.findViewById(R.id.options_text); + + answerView.setText(queries.get(i).getAnswer()); + shortAnswerView.setText(queries.get(i).getShortAnswer()); + optionsView.setText(queries.get(i).getOptions()); + + final int[] position = new int[] {i}; + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(adapterView.getContext()); + alertDialog.setTitle(queries.get(i).getQuery()); + alertDialog.setView(mView); + alertDialog.setPositiveButton(R.string.close, null); + alertDialog.setNeutralButton(R.string.copy_query, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + editText.setText(""); + editText.append(queries.get(position[0]).getQuery()); + dialogInterface.dismiss(); + } + }); + AlertDialog alert = alertDialog.create(); + alert.show(); + } + }); + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + editText.getText().clear(); + editText.append(queries.get(i).getQuery()); + return false; + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle item selection + switch (item.getItemId()) { + case R.id.menu_settings: + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + public void onButtonClick(View view) { + // connect to the server + String s = editText.getText().toString(); + if (s.isEmpty()) + return; + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + String endpoint = sharedPref.getString("pref_endpoint", "kauron.ddns.net"); + int port = Integer.valueOf(sharedPref.getString("pref_port", "2048")); + + Query q = new Query(s, endpoint, port, stopwordsCheck.isChecked(), stemmingCheck.isChecked(), this); + new QueryTask().execute(q); + queries.add(0, q); + mAdapter.notifyDataSetChanged(); + editText.setText(""); + editText.requestFocus(); + } + + public void onSymbolClick(View view) { + editText.append(((Button)view).getText().toString()); + } + + public void onBoolClick(View view) { + String s = ((Button)view).getText().toString() + ' '; + String text = editText.getText().toString(); + if (!text.isEmpty() && text.charAt(text.length() - 1) != ' ') + s = ' ' + s; + editText.append(s); + } + + public void onFieldClick(View view) { + String s = ((Button)view).getText().toString(); + String text = editText.getText().toString(); + if (!text.isEmpty() && text.charAt(text.length() - 1) != ' ') + s = ' ' + s; + editText.append(s); + } + + + private class QueryTask extends AsyncTask { + @Override + protected Void doInBackground(Query... queries) { + Query q = queries[0]; + String message = q.getQuery() + q.getShortOptions(); + + TCPClient mTcpClient = new TCPClient(message, q.getEndpoint(), new TCPClient.OnMessageReceived() { + @Override + //here the messageReceived method is implemented + public void messageReceived(String response) { + MainActivity.this.queries.get(0).setAnswer(response); + } + }); + mTcpClient.run(); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + mAdapter.notifyDataSetChanged(); + } + } +} diff --git a/app/src/main/java/com/kauron/newssarcher/Query.java b/app/src/main/java/com/kauron/newssarcher/Query.java new file mode 100644 index 0000000..fd2453c --- /dev/null +++ b/app/src/main/java/com/kauron/newssarcher/Query.java @@ -0,0 +1,58 @@ +package com.kauron.newssarcher; + +import android.content.Context; + +class Query { + private final String query; + private String answer; + private final boolean noStopwords; + private final boolean stemming; + private final Context context; + private final String host; + private final int port; + + Query(String query, String host, int port, boolean noStopwords, boolean stemming, Context context) { + this.query = query; + this.noStopwords = noStopwords; + this.stemming = stemming; + this.context = context; + this.host = host; + this.port = port; + } + + String getEndpoint() { + return host + ":" + port; + } + + String getQuery() { + return query; + } + + String getAnswer() { + return answer; + } + + String getOptions() { + return String.format("Stemming (%s), Remove stopwords (%s)", stemming ? "yes" : "no", + noStopwords ? "yes" : "no"); + } + + String getShortOptions() { + return (stemming ? " -s" : "") + (noStopwords ? " -n" : ""); + } + + String getShortAnswer() { + if (answer == null) + return context.getString(R.string.no_answer_yet); + else + return answer.substring(answer.lastIndexOf('\n') + 1); + } + + void setAnswer(String answer) { + this.answer = answer; + } + + boolean hasAnswer() { + return answer == null; + } +} diff --git a/app/src/main/java/com/kauron/newssarcher/QueryAdapter.java b/app/src/main/java/com/kauron/newssarcher/QueryAdapter.java new file mode 100644 index 0000000..3198083 --- /dev/null +++ b/app/src/main/java/com/kauron/newssarcher/QueryAdapter.java @@ -0,0 +1,41 @@ +package com.kauron.newssarcher; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import java.util.ArrayList; + +class QueryAdapter extends ArrayAdapter { + + QueryAdapter(@NonNull Context context, @NonNull ArrayList objects) { + super(context, R.layout.query_list_item, objects); + } + + @NonNull + @Override + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + // Get the data item for this position + Query q = getItem(position); + + LayoutInflater inflater = LayoutInflater.from(getContext()); + if (convertView == null) + convertView = inflater.inflate(R.layout.query_list_item, parent, false); + TextView query = (TextView) convertView.findViewById(R.id.query_text); + TextView options = (TextView) convertView.findViewById(R.id.options_text); + TextView result = (TextView) convertView.findViewById(R.id.result_text); + + if (q != null) { + query.setText(q.getQuery()); + options.setText(q.getOptions()); + result.setText(q.getShortAnswer()); + } + + // Return the completed view to render on screen + return convertView; + } +} diff --git a/app/src/main/java/com/kauron/newssarcher/SettingsActivity.java b/app/src/main/java/com/kauron/newssarcher/SettingsActivity.java new file mode 100644 index 0000000..cb69240 --- /dev/null +++ b/app/src/main/java/com/kauron/newssarcher/SettingsActivity.java @@ -0,0 +1,28 @@ +package com.kauron.newssarcher; + +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; + +public class SettingsActivity extends PreferenceActivity { + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Display the fragment as the main content. + getFragmentManager().beginTransaction() + .replace(android.R.id.content, new SettingsFragment()) + .commit(); + } + + + public static class SettingsFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.pref_general); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kauron/newssarcher/TCPClient.java b/app/src/main/java/com/kauron/newssarcher/TCPClient.java new file mode 100644 index 0000000..33afab6 --- /dev/null +++ b/app/src/main/java/com/kauron/newssarcher/TCPClient.java @@ -0,0 +1,70 @@ +package com.kauron.newssarcher; + +import android.util.Log; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.Socket; + +class TCPClient { + + private String SERVER_DOMAIN = "kauron.ddns.net"; //your computer IP address + private int SERVER_PORT = 2048; + private OnMessageReceived mMessageListener = null; + private final String message; + + /** + * Constructor of the class. OnMessagedReceived listens for the messages received from server + */ + TCPClient(String message, String endpoint, OnMessageReceived listener) { + mMessageListener = listener; + this.message = message; + if (endpoint.contains(":")) { + String[] strings = endpoint.split(":"); + SERVER_DOMAIN = strings[0]; + SERVER_PORT = Integer.valueOf(strings[1]); + } + } + + void run() { + try { + Socket socket = new Socket(SERVER_DOMAIN, SERVER_PORT); + try { + //send the message to the server + PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); + if (!out.checkError()) { + out.print(this.message); + out.flush(); + } + //receive the message which the server sends back + BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + String text = "", line; + while ((line = in.readLine()) != null) { + text += line + '\n'; + } + text = text.substring(0, text.length() - 1); + + if (mMessageListener != null) { + mMessageListener.messageReceived(text); + } + } catch (Exception e) { + Log.e("TCP", "S: Error", e); + } finally { + //the socket must be closed. It is not possible to reconnect to this socket + // after it is closed, which means a new socket instance has to be created. + socket.close(); + } + } catch (Exception e) { + Log.e("TCP", "C: Error", e); + } + } + + //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity + //class at on asynckTask doInBackground + interface OnMessageReceived { + void messageReceived(String message); + } +} diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 0000000..affc7ba --- /dev/null +++ b/app/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml new file mode 100644 index 0000000..ce997a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a19d7e2 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + +