From 248b1fa40d494f74f49d38ab59c352a1d6130513 Mon Sep 17 00:00:00 2001 From: sos Date: Wed, 5 Sep 2018 22:47:06 +0200 Subject: [PATCH 001/151] Initial gradle files --- app/build.gradle | 60 ++++++++ build.gradle | 31 ++++ gradle.properties | 13 ++ gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++++++++++++ gradlew.bat | 84 +++++++++++ settings.gradle | 2 + 7 files changed, 368 insertions(+) create mode 100644 app/build.gradle create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..8167604 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,60 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "0.0" + + applicationId "com.socros.android.app.gitez" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + debug { + resValue 'string', 'appName', 'Gitez dev' + applicationIdSuffix '.debug' + versionNameSuffix '.debug' + + minifyEnabled false + useProguard false + shrinkResources false + } + release { + resValue 'string', 'appName', 'Gitez' + + minifyEnabled false + useProguard false + shrinkResources false + + files { rootProject.file('settings/proguard').listFiles() }.each { + proguardFile it + } + } + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } +} + +androidExtensions { + experimental = true + defaultCacheImplementation = 'SPARSE_ARRAY' +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + implementation 'com.android.support:appcompat-v7:27.1.1' + 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/build.gradle b/build.gradle new file mode 100644 index 0000000..f5bb02c --- /dev/null +++ b/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext { + kotlinVersion = '1.2.61' + minSdkVersion = 21 + targetSdkVersion = 27 + compileSdkVersion = 27 + buildToolsVersion = '27.0.3' + } + + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.1.4' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" + classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlinVersion" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..743d692 --- /dev/null +++ b/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/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f6bd878 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Sep 05 21:17:02 CEST 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/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/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/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/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/settings.gradle b/settings.gradle new file mode 100644 index 0000000..b26bdb8 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "Gitez" +include ':app' From 277253f120d0a3a8a28a437ee24162cce907b6e4 Mon Sep 17 00:00:00 2001 From: sos Date: Wed, 5 Sep 2018 23:00:58 +0200 Subject: [PATCH 002/151] Auto generate versionCode and versionName --- app/build.gradle | 6 ++++-- build.gradle | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8167604..15c3e1e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "0.0" + versionCode getAutoVersionCode() + versionName getAutoVersionName() applicationId "com.socros.android.app.gitez" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -41,7 +41,9 @@ android { } sourceSets { + androidTest.java.srcDirs += 'src/androidTest/kotlin' main.java.srcDirs += 'src/main/kotlin' + test.java.srcDirs += 'src/test/kotlin' } } diff --git a/build.gradle b/build.gradle index f5bb02c..a6426b4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + buildscript { ext { kotlinVersion = '1.2.61' @@ -29,3 +31,43 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir } + +static def getAutoVersionName() { + if (getCurrentBranch() == "master") { + return "${getLastMasterGitTagVersion()}" + } else { + return "${getBuildDate()} #${getGitCommitsCount()}.${getGitSha()}.${getCurrentBranch()}" + } +} + +static def getAutoVersionCode() { + return getGitCommitsCount().toInteger() +} + +static def getGitSha() { + //return "git --git-dir=${rootDir}/../.git --work-tree=${rootDir}/../ rev-parse --short HEAD".execute().text.trim() + return "git rev-parse --verify --short HEAD".execute().text.trim() +} + +static def getCurrentBranch() { + return "git rev-parse --abbrev-ref HEAD".execute().text.trim() +} + +static def getBuildDate() { + def df = new SimpleDateFormat("dd.MM.''yy") + df.setTimeZone(TimeZone.getTimeZone("UTC")) + return df.format(new Date()) +} + +static def getGitCommitsCount() { + return ("git rev-list ${getCurrentBranch()} --count").execute().text.trim() +} + +static def getLastMasterGitTagVersion() { + def longVersionName = "git describe --tags master --long".execute().text.replace("v", "").trim() + def (fullVersionTag, versionBuild, gitSha) = longVersionName.tokenize('-') + def (versionMajor, versionMinor, versionPatch) = fullVersionTag.tokenize('.') + + return sprintf("%s.%s.%s", [versionMajor, versionMinor, versionPatch]) +} + From af9bfdafbf735a1af260768a5d8c556ec3e16643 Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 6 Sep 2018 12:44:01 +0200 Subject: [PATCH 003/151] Define major resources --- app/src/main/res/values/colors.xml | 24 ++++++++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/values/styles.xml | 2 ++ app/src/main/res/values/themes.xml | 23 +++++++++++++++++++++++ 4 files changed, 51 insertions(+) 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/values/themes.xml diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..ceb1d12 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,24 @@ + + + + @color/white + @color/github_gray900 + + @color/github_gray900 + #4c5157 + @color/black + + #ffb300 + #ffe54c + #c68400 + + #24292e + #3c4146 + #b3bcc7 + #eff4fc + #fafbfc + + #fff + #000 + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..8542005 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..8542005 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..8f3287c --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v27/themes.xml b/app/src/main/res/values-v27/themes.xml new file mode 100644 index 0000000..9fd5704 --- /dev/null +++ b/app/src/main/res/values-v27/themes.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ceb1d12..b10477b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,6 +3,7 @@ @color/white @color/github_gray900 + #5000 @color/github_gray900 #4c5157 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 8f3287c..544c608 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -8,7 +8,9 @@ @color/accent - - From 9f9fc579c33c23889d914fa0514be2fbb9c03c2a Mon Sep 17 00:00:00 2001 From: sos Date: Mon, 10 Sep 2018 19:44:31 +0200 Subject: [PATCH 024/151] Fix gradle config --- tim/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tim/build.gradle b/tim/build.gradle index 25a75c2..9511dc1 100644 --- a/tim/build.gradle +++ b/tim/build.gradle @@ -42,6 +42,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" - implementation 'com.jakewharton.timber:timber:4.7.1' + api 'com.jakewharton.timber:timber:4.7.1' testImplementation 'junit:junit:4.12' } From 7683ccfd09e4fbf90a2575973c20a3baf484dd4c Mon Sep 17 00:00:00 2001 From: sos Date: Mon, 10 Sep 2018 19:48:21 +0200 Subject: [PATCH 025/151] Refactor - move proper classes to splash module --- .../app/gitez/{ => view/splash}/SplashQuotesTest.kt | 12 +++++++----- app/src/main/AndroidManifest.xml | 2 +- .../android/app/gitez/view/LauncherActivity.kt | 6 ------ .../android/app/gitez/view/splash/SplashActivity.kt | 6 ++++++ 4 files changed, 14 insertions(+), 12 deletions(-) rename app/src/androidTest/kotlin/com/socros/android/app/gitez/{ => view/splash}/SplashQuotesTest.kt (64%) delete mode 100644 app/src/main/kotlin/com/socros/android/app/gitez/view/LauncherActivity.kt create mode 100644 app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt diff --git a/app/src/androidTest/kotlin/com/socros/android/app/gitez/SplashQuotesTest.kt b/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt similarity index 64% rename from app/src/androidTest/kotlin/com/socros/android/app/gitez/SplashQuotesTest.kt rename to app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt index c74440b..e3c4a98 100644 --- a/app/src/androidTest/kotlin/com/socros/android/app/gitez/SplashQuotesTest.kt +++ b/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt @@ -1,6 +1,8 @@ -package com.socros.android.app.gitez +package com.socros.android.app.gitez.view.splash import android.support.test.runner.AndroidJUnit4 +import com.socros.android.app.gitez.R.array +import com.socros.android.app.gitez.ResourceTest import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -14,8 +16,8 @@ class SplashQuotesTest : ResourceTest() { @Before fun init() { - quotesLocales = targetCtx.getResourceLocales(R.array.splash_quotes).toTypedArray() - authorsLocales = targetCtx.getResourceLocales(R.array.splash_quoteAuthors).toTypedArray() + quotesLocales = targetCtx.getResourceLocales(array.splash_quotes).toTypedArray() + authorsLocales = targetCtx.getResourceLocales(array.splash_quoteAuthors).toTypedArray() } @Test @@ -27,8 +29,8 @@ class SplashQuotesTest : ResourceTest() { fun quotesWithAuthorsMatchEqualityTest() { for (locale in quotesLocales) { val res = getLocalizedContext(locale).resources - val quotes = res.getStringArray(R.array.splash_quotes) - val authors = res.getStringArray(R.array.splash_quoteAuthors) + val quotes = res.getStringArray(array.splash_quotes) + val authors = res.getStringArray(array.splash_quoteAuthors) assertEquals( "Quotes (${quotes.size}) aren't match authors (${authors.size}) array size for \"$locale\" language!", quotes.size, authors.size) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8f27f4..77f109a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:theme="@style/GitezTheme"> diff --git a/app/src/main/kotlin/com/socros/android/app/gitez/view/LauncherActivity.kt b/app/src/main/kotlin/com/socros/android/app/gitez/view/LauncherActivity.kt deleted file mode 100644 index 85f28a7..0000000 --- a/app/src/main/kotlin/com/socros/android/app/gitez/view/LauncherActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.socros.android.app.gitez.view - -import android.support.v7.app.AppCompatActivity - -class LauncherActivity : AppCompatActivity() { -} diff --git a/app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt b/app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt new file mode 100644 index 0000000..0b8c056 --- /dev/null +++ b/app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt @@ -0,0 +1,6 @@ +package com.socros.android.app.gitez.view.splash + +import android.support.v7.app.AppCompatActivity + +class SplashActivity : AppCompatActivity() { +} From e359adb6a7f9a8a3981719f662fdece0a8f42980 Mon Sep 17 00:00:00 2001 From: sos Date: Mon, 10 Sep 2018 20:15:24 +0200 Subject: [PATCH 026/151] =?UTF-8?q?Refactor=20-=20splash=20=E2=86=92=20lau?= =?UTF-8?q?ncher=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/gitez/view/{splash => launcher}/SplashQuotesTest.kt | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../app/gitez/view/{splash => launcher}/SplashActivity.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename app/src/androidTest/kotlin/com/socros/android/app/gitez/view/{splash => launcher}/SplashQuotesTest.kt (95%) rename app/src/main/kotlin/com/socros/android/app/gitez/view/{splash => launcher}/SplashActivity.kt (65%) diff --git a/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt b/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/launcher/SplashQuotesTest.kt similarity index 95% rename from app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt rename to app/src/androidTest/kotlin/com/socros/android/app/gitez/view/launcher/SplashQuotesTest.kt index e3c4a98..63430b0 100644 --- a/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/splash/SplashQuotesTest.kt +++ b/app/src/androidTest/kotlin/com/socros/android/app/gitez/view/launcher/SplashQuotesTest.kt @@ -1,4 +1,4 @@ -package com.socros.android.app.gitez.view.splash +package com.socros.android.app.gitez.view.launcher import android.support.test.runner.AndroidJUnit4 import com.socros.android.app.gitez.R.array diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 77f109a..e2fc1a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:theme="@style/GitezTheme"> diff --git a/app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt b/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt similarity index 65% rename from app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt rename to app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt index 0b8c056..30c1f0a 100644 --- a/app/src/main/kotlin/com/socros/android/app/gitez/view/splash/SplashActivity.kt +++ b/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt @@ -1,4 +1,4 @@ -package com.socros.android.app.gitez.view.splash +package com.socros.android.app.gitez.view.launcher import android.support.v7.app.AppCompatActivity From 7e3c76e117ed6186be852b555dc9ec5c07e60a63 Mon Sep 17 00:00:00 2001 From: sos Date: Mon, 10 Sep 2018 20:16:33 +0200 Subject: [PATCH 027/151] Add Reactive extensions --- build.gradle | 3 ++ util/build.gradle | 6 +++ .../com/socros/android/lib/util/RxExt.kt | 48 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 util/src/main/kotlin/com/socros/android/lib/util/RxExt.kt diff --git a/build.gradle b/build.gradle index a6426b4..d50281b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,9 @@ buildscript { targetSdkVersion = 27 compileSdkVersion = 27 buildToolsVersion = '27.0.3' + rxJavaVersion = '2.1.14' + rxAndroidVersion = '2.0.1' + rxKotlinVersion = '2.2.0' } repositories { diff --git a/util/build.gradle b/util/build.gradle index 759f6ec..072dd22 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -43,6 +43,12 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + // Reactive + implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion" + implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion" + implementation "io.reactivex.rxjava2:rxkotlin:$rxKotlinVersion" + + // Tests implementation 'com.android.support:appcompat-v7:27.1.1' testImplementation 'junit:junit:4.12' } diff --git a/util/src/main/kotlin/com/socros/android/lib/util/RxExt.kt b/util/src/main/kotlin/com/socros/android/lib/util/RxExt.kt new file mode 100644 index 0000000..2f256c5 --- /dev/null +++ b/util/src/main/kotlin/com/socros/android/lib/util/RxExt.kt @@ -0,0 +1,48 @@ +package com.socros.android.lib.util + +import io.reactivex.Observable +import io.reactivex.ObservableSource +import io.reactivex.ObservableTransformer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.functions.BiFunction +import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit + +fun Observable.mapToTrue(): Observable = this.map { _ -> true } + +@Suppress("UNCHECKED_CAST") +fun Observable.composeAsync(): Observable = + this.compose(asyncTransformer as ObservableTransformer) + +private val asyncTransformer = AsyncTransformer() + +private class AsyncTransformer : ObservableTransformer { + override fun apply(upstream: Observable): ObservableSource { + return upstream.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } +} + +/** + * Returns an Observable that emits the items emitted by the source ObservableSource shifted forward in time to + * a specified delay only if it's shorter than specified delay. If `delayError` is true, error notifications + * will be delayed to at least `delay`. + * + * **Scheduler:** + * + *          This version of `delay` operates by default on the `computation` [`Scheduler`][io.reactivex.Scheduler] + * + * @param delay the delay to shift the source to + * @param unit the {@link TimeUnit} in which {@code period} is defined + * @param delayError if `true`, the upstream exception is signalled with at least given delay or after all preceding + * normal elements, if `false`, the upstream exception is signalled immediately + * @return the source ObservableSource shifted in time to at least the specified delay + */ +fun Observable.delayToAtLeast(delay: Long, unit: TimeUnit, delayError: Boolean = false): Observable { + return Observable.zip( + this, + Observable.timer(delay, unit), + BiFunction { source, _ -> source }, + delayError + ) +} From 11778a670e00d54183dedfa45de9868b7a34f820 Mon Sep 17 00:00:00 2001 From: sos Date: Mon, 10 Sep 2018 20:23:37 +0200 Subject: [PATCH 028/151] Add base launchers --- app/build.gradle | 1 + base/build.gradle | 7 +++ .../app/base/view/launcher/Launcher.kt | 7 +++ .../base/view/launcher/LauncherActivity.kt | 19 +++++++ .../app/base/view/launcher/SplashActivity.kt | 50 +++++++++++++++++++ tim/build.gradle | 2 + 6 files changed, 86 insertions(+) create mode 100644 base/src/main/kotlin/com/socros/android/app/base/view/launcher/Launcher.kt create mode 100644 base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt create mode 100644 base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt diff --git a/app/build.gradle b/app/build.gradle index 525bac6..1680a51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,7 @@ dependencies { implementation project(':tim') implementation project(':util') + // Tests implementation 'com.android.support:appcompat-v7:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/base/build.gradle b/base/build.gradle index b33494e..cfc93f8 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -50,7 +50,14 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" implementation project(':tim') + implementation project(':util') + // Reactive + api "io.reactivex.rxjava2:rxjava:$rxJavaVersion" + api "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion" + api "io.reactivex.rxjava2:rxkotlin:$rxKotlinVersion" + + // Tests implementation 'com.android.support:appcompat-v7:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/Launcher.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/Launcher.kt new file mode 100644 index 0000000..636e683 --- /dev/null +++ b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/Launcher.kt @@ -0,0 +1,7 @@ +package com.socros.android.app.base.view.launcher + +import android.content.Intent + +interface Launcher { + fun provideNextActivity(): Intent +} diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt new file mode 100644 index 0000000..5be02f1 --- /dev/null +++ b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt @@ -0,0 +1,19 @@ +package com.socros.android.app.base.view.launcher + +import android.app.Activity +import android.os.Bundle + +/** + * Fist app activity that decide which activity should be run as first depends on user logged in status. + * + * Use with `android:theme="@android:style/Theme.NoDisplay"` + */ +abstract class LauncherActivity : Activity(), Launcher { + + override fun onCreate(savedInstanceState: Bundle?) { + startActivity(provideNextActivity()) + finish() + super.onCreate(savedInstanceState) + } + +} diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt new file mode 100644 index 0000000..741c68c --- /dev/null +++ b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt @@ -0,0 +1,50 @@ +package com.socros.android.app.base.view.launcher + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import com.socros.android.lib.util.composeAsync +import com.socros.android.lib.util.delayToAtLeast +import io.reactivex.Observable +import java.util.concurrent.TimeUnit.MILLISECONDS + +/** + * Fist app activity that decide which activity should be run as first depends on user logged in status. + */ +@Suppress("MemberVisibilityCanBePrivate") +abstract class SplashActivity : AppCompatActivity(), Launcher { + + /** + * You can pass null when you set view as theme window background + */ + protected abstract val layoutResId: Int? + + protected abstract val splashMinVisibilityTime: Int + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + layoutResId?.let { + setContentView(it) + } + + provideObservableOperation() + ?.delayToAtLeast(splashMinVisibilityTime.toLong(), MILLISECONDS) + ?.composeAsync() + ?.subscribeOperation() + + ?: Observable.timer(splashMinVisibilityTime.toLong(), MILLISECONDS) + .subscribe { launchProperActivity() } + } + + protected open fun provideObservableOperation(): Observable? = null + + protected open fun Observable.subscribeOperation() { + throw NotImplementedError( + "If you override `provideObservableOperation` you must also override `subscribeOperation`") + } + + protected open fun launchProperActivity() { + startActivity(provideNextActivity()) + finish() + } + +} diff --git a/tim/build.gradle b/tim/build.gradle index 9511dc1..45c89f7 100644 --- a/tim/build.gradle +++ b/tim/build.gradle @@ -43,5 +43,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" api 'com.jakewharton.timber:timber:4.7.1' + + // Tests testImplementation 'junit:junit:4.12' } From 5cf3ac7cfff15190c92254ef4a46b9ce9baf94fb Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 09:45:30 +0200 Subject: [PATCH 029/151] Optimize dependencies --- app/build.gradle | 4 +++- base/build.gradle | 5 ++++- build.gradle | 6 ++++-- tim/build.gradle | 2 ++ util/build.gradle | 4 +++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1680a51..2a4d93e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,8 +60,10 @@ dependencies { implementation project(':tim') implementation project(':util') + // Support + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + // Tests - implementation 'com.android.support:appcompat-v7:27.1.1' 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/base/build.gradle b/base/build.gradle index cfc93f8..3de8564 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -52,13 +52,16 @@ dependencies { implementation project(':tim') implementation project(':util') + // Support + api "androidx.appcompat:appcompat:$appCompatVersion" + api "com.google.android.material:material:$materialVersion" + // Reactive api "io.reactivex.rxjava2:rxjava:$rxJavaVersion" api "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion" api "io.reactivex.rxjava2:rxkotlin:$rxKotlinVersion" // Tests - implementation 'com.android.support:appcompat-v7:27.1.1' 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/build.gradle b/build.gradle index d50281b..305330b 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,11 @@ buildscript { ext { kotlinVersion = '1.2.61' minSdkVersion = 21 - targetSdkVersion = 27 - compileSdkVersion = 27 + targetSdkVersion = 28 + compileSdkVersion = 28 buildToolsVersion = '27.0.3' + appCompatVersion = '1.0.0-rc02' + materialVersion = '1.0.0-rc02' rxJavaVersion = '2.1.14' rxAndroidVersion = '2.0.1' rxKotlinVersion = '2.2.0' diff --git a/tim/build.gradle b/tim/build.gradle index 45c89f7..721f49d 100644 --- a/tim/build.gradle +++ b/tim/build.gradle @@ -42,6 +42,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + + // Utils api 'com.jakewharton.timber:timber:4.7.1' // Tests diff --git a/util/build.gradle b/util/build.gradle index 072dd22..6227f16 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -43,12 +43,14 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + // Support + implementation "androidx.appcompat:appcompat:$appCompatVersion" + // Reactive implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion" implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion" implementation "io.reactivex.rxjava2:rxkotlin:$rxKotlinVersion" // Tests - implementation 'com.android.support:appcompat-v7:27.1.1' testImplementation 'junit:junit:4.12' } From 004223e0f7bcc521c40b27fb4789ca1abc2b9083 Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 10:51:09 +0200 Subject: [PATCH 030/151] Fix splash behavior with activity lifecycle --- ...herActivity.kt => BaseLauncherActivity.kt} | 2 +- .../base/view/launcher/BaseSplashActivity.kt | 88 +++++++++++++++++++ .../app/base/view/launcher/SplashActivity.kt | 50 ----------- 3 files changed, 89 insertions(+), 51 deletions(-) rename base/src/main/kotlin/com/socros/android/app/base/view/launcher/{LauncherActivity.kt => BaseLauncherActivity.kt} (87%) create mode 100644 base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseSplashActivity.kt delete mode 100644 base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseLauncherActivity.kt similarity index 87% rename from base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt rename to base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseLauncherActivity.kt index 5be02f1..55cd31e 100644 --- a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/LauncherActivity.kt +++ b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseLauncherActivity.kt @@ -8,7 +8,7 @@ import android.os.Bundle * * Use with `android:theme="@android:style/Theme.NoDisplay"` */ -abstract class LauncherActivity : Activity(), Launcher { +abstract class BaseLauncherActivity : Activity(), Launcher { override fun onCreate(savedInstanceState: Bundle?) { startActivity(provideNextActivity()) diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseSplashActivity.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseSplashActivity.kt new file mode 100644 index 0000000..28cb492 --- /dev/null +++ b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/BaseSplashActivity.kt @@ -0,0 +1,88 @@ +package com.socros.android.app.base.view.launcher + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.socros.android.lib.util.composeAsync +import com.socros.android.lib.util.delayToAtLeast +import io.reactivex.Observable +import io.reactivex.disposables.Disposable +import io.reactivex.subjects.BehaviorSubject +import java.util.concurrent.TimeUnit.MILLISECONDS + +/** + * Fist app activity that decide which activity should be run as first depends on user logged in status. + */ +@Suppress("MemberVisibilityCanBePrivate") +abstract class BaseSplashActivity : AppCompatActivity(), Launcher { + + object SplashStartOperation { + private val subject by lazy { BehaviorSubject.create() } + + val finished: Observable + get() = subject.filter { it } + + fun setFinished() { + subject.onNext(true) + } + + fun setConsumed() { + subject.onNext(false) + } + } + + /** + * You can pass null when you set view as theme window background + */ + protected abstract val layoutResId: Int? + protected abstract val splashMinVisibilityTime: Int + + private lateinit var disposable: Disposable + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + layoutResId?.let { + setContentView(it) + } + + if (savedInstanceState == null) { + provideObservableOperation() + ?.delayToAtLeast(splashMinVisibilityTime.toLong(), MILLISECONDS) + ?.composeAsync() + ?.subscribeOperation() + + ?: Observable.timer(splashMinVisibilityTime.toLong(), MILLISECONDS) + .subscribe { onSplashStartOperationFinished() } + } + } + + override fun onResume() { + super.onResume() + disposable = SplashStartOperation.finished.subscribe { + SplashStartOperation.setConsumed() + launchProperActivity() + } + } + + override fun onPause() { + disposable.dispose() + super.onPause() + } + + protected open fun provideObservableOperation(): Observable? = null + + protected open fun Observable.subscribeOperation(): Disposable { + throw NotImplementedError( + "If you override `provideObservableOperation` you must also override `subscribeOperation`.\n" + + "Remember to call `onSplashStartOperationFinished()` method.") + } + + protected fun onSplashStartOperationFinished() { + SplashStartOperation.setFinished() + } + + protected open fun launchProperActivity() { + startActivity(provideNextActivity()) + finish() + } + +} diff --git a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt b/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt deleted file mode 100644 index 741c68c..0000000 --- a/base/src/main/kotlin/com/socros/android/app/base/view/launcher/SplashActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.socros.android.app.base.view.launcher - -import android.os.Bundle -import android.support.v7.app.AppCompatActivity -import com.socros.android.lib.util.composeAsync -import com.socros.android.lib.util.delayToAtLeast -import io.reactivex.Observable -import java.util.concurrent.TimeUnit.MILLISECONDS - -/** - * Fist app activity that decide which activity should be run as first depends on user logged in status. - */ -@Suppress("MemberVisibilityCanBePrivate") -abstract class SplashActivity : AppCompatActivity(), Launcher { - - /** - * You can pass null when you set view as theme window background - */ - protected abstract val layoutResId: Int? - - protected abstract val splashMinVisibilityTime: Int - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - layoutResId?.let { - setContentView(it) - } - - provideObservableOperation() - ?.delayToAtLeast(splashMinVisibilityTime.toLong(), MILLISECONDS) - ?.composeAsync() - ?.subscribeOperation() - - ?: Observable.timer(splashMinVisibilityTime.toLong(), MILLISECONDS) - .subscribe { launchProperActivity() } - } - - protected open fun provideObservableOperation(): Observable? = null - - protected open fun Observable.subscribeOperation() { - throw NotImplementedError( - "If you override `provideObservableOperation` you must also override `subscribeOperation`") - } - - protected open fun launchProperActivity() { - startActivity(provideNextActivity()) - finish() - } - -} From f4bbdfea58d194ed86a0281eb857a87353c873c4 Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 11:20:14 +0200 Subject: [PATCH 031/151] Add base resources --- .../main/res/animator/card_lift_selector.xml | 26 ++ base/src/main/res/values-w820dp/dimens.xml | 8 + base/src/main/res/values/attrs.xml | 9 + base/src/main/res/values/colors.xml | 61 ++++ base/src/main/res/values/dimens.xml | 102 ++++++ base/src/main/res/values/ids.xml | 13 + base/src/main/res/values/styles.xml | 322 ++++++++++++++++++ base/src/main/res/values/themes.xml | 14 + 8 files changed, 555 insertions(+) create mode 100644 base/src/main/res/animator/card_lift_selector.xml create mode 100644 base/src/main/res/values-w820dp/dimens.xml create mode 100644 base/src/main/res/values/attrs.xml create mode 100644 base/src/main/res/values/colors.xml create mode 100644 base/src/main/res/values/dimens.xml create mode 100644 base/src/main/res/values/ids.xml create mode 100644 base/src/main/res/values/styles.xml create mode 100644 base/src/main/res/values/themes.xml diff --git a/base/src/main/res/animator/card_lift_selector.xml b/base/src/main/res/animator/card_lift_selector.xml new file mode 100644 index 0000000..fde0c7e --- /dev/null +++ b/base/src/main/res/animator/card_lift_selector.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/values-w820dp/dimens.xml b/base/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..072436a --- /dev/null +++ b/base/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,8 @@ + + + + 64dp + 60dp + 48dp + + diff --git a/base/src/main/res/values/attrs.xml b/base/src/main/res/values/attrs.xml new file mode 100644 index 0000000..3367d58 --- /dev/null +++ b/base/src/main/res/values/attrs.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/base/src/main/res/values/colors.xml b/base/src/main/res/values/colors.xml new file mode 100644 index 0000000..e3742d0 --- /dev/null +++ b/base/src/main/res/values/colors.xml @@ -0,0 +1,61 @@ + + + + #fff + #000 + #0000 + + #3f51b5 + #757de8 + #002984 + + #ff4081 + #ff79b0 + #c60055 + + #2000 + #4fff + + #5000 + + #de000000 + #8a000000 + #61000000 + + #52000000 + #8a000000 + #42000000 + + #fff + #b3ffffff + #80ffffff + #3fff + #fff + #4fffffff + + #c00 + #f66d6c + + #1f000000 + #1fffffff + #42000000 + #4d000000 + + @color/textPrimary_onLight + + @color/textSecondary_onLight + @color/accent + @color/textSecondary_onLight + @color/textSecondary_onLight + + @color/accent + @color/accent + + #e62117 + #3b5998 + #007bb5 + #55acee + #cb2027 + #24292e + + diff --git a/base/src/main/res/values/dimens.xml b/base/src/main/res/values/dimens.xml new file mode 100644 index 0000000..0667d3f --- /dev/null +++ b/base/src/main/res/values/dimens.xml @@ -0,0 +1,102 @@ + + + -1 + -2 + + 16dp + 12dp + 0dp + 16dp + 10dp + + 48dp + 56dp + 4dp + -4dp + + 7dp + -7dp + -3dp + + 12sp + 14sp + 14sp + 13sp + 16sp + 16sp + 20sp + 24sp + 34sp + 45sp + 56sp + 112sp + + 36dp + 44dp + 32dp + 16dp + 6dp + 2dp + + 9dp + 12dp + 17.5dp + + 24dp + 24dp + 16dp + 16dp + 16dp + 9dp + 8dp + 8dp + 6dp + 12dp + 6dp + 4dp + 3dp + 8dp + 2dp + 8dp + 2dp + 3dp + 2dp + 3dp + 2dp + 1dp + + 1dp + -1dp + + 20sp + + 24dp + + + + + 6dp + 0dp + @dimen/dialogPadding + + 16dp + 24dp + 10dp + 14.5dp + 22.5dp + + + 13dp + 21dp + 16dp + 12dp + 8dp + 2dp + 8dp + 16dp + 24dp + 40dp + + 16dp + + diff --git a/base/src/main/res/values/ids.xml b/base/src/main/res/values/ids.xml new file mode 100644 index 0000000..c53a11c --- /dev/null +++ b/base/src/main/res/values/ids.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/src/main/res/values/styles.xml b/base/src/main/res/values/styles.xml new file mode 100644 index 0000000..aa99e89 --- /dev/null +++ b/base/src/main/res/values/styles.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/base/src/main/res/values/themes.xml b/base/src/main/res/values/themes.xml new file mode 100644 index 0000000..6801c65 --- /dev/null +++ b/base/src/main/res/values/themes.xml @@ -0,0 +1,14 @@ + + + + + + + + From c075705a01b95298caae43be596d819751f4bbcf Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 11:20:24 +0200 Subject: [PATCH 032/151] Add math extensions --- .../com/socros/android/lib/util/MathExt.kt | 84 +++++++++++++++++++ .../android/lib/util/MathExtensionsTest.kt | 33 ++++++++ .../com/socros/android/lib/util/Repeat.kt | 6 ++ .../com/socros/android/lib/util/RepeatRule.kt | 27 ++++++ 4 files changed, 150 insertions(+) create mode 100644 util/src/main/kotlin/com/socros/android/lib/util/MathExt.kt create mode 100644 util/src/test/kotlin/com/socros/android/lib/util/MathExtensionsTest.kt create mode 100644 util/src/test/kotlin/com/socros/android/lib/util/Repeat.kt create mode 100644 util/src/test/kotlin/com/socros/android/lib/util/RepeatRule.kt diff --git a/util/src/main/kotlin/com/socros/android/lib/util/MathExt.kt b/util/src/main/kotlin/com/socros/android/lib/util/MathExt.kt new file mode 100644 index 0000000..ebf7a86 --- /dev/null +++ b/util/src/main/kotlin/com/socros/android/lib/util/MathExt.kt @@ -0,0 +1,84 @@ +package com.socros.android.lib.util + +import java.util.Random + +/** + * Generate random number from specified range + */ +fun ClosedRange.random() = + if (endInclusive <= start) start + else Random().nextInt(endInclusive - start) + start + + +/** + * `it == value`, *equals* + */ +inline fun T.eq(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this == value) action(this) +} + +/** + * `it == value`, *equals* + */ +inline fun T.equals(value: T, action: (T) -> Unit) where T : Number, T : Comparable = eq(value, action) + +/** + * `it != value`, *not equals* + */ +inline fun T.ne(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this != value) action(this) +} + +/** + * `it != value`, *equals* + */ +inline fun T.notEquals(value: T, action: (T) -> Unit) where T : Number, T : Comparable = ne(value, action) + +/** + * `it > value`, *greater than* + */ +inline fun T.gt(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this > value) action(this) +} + +/** + * `it > value`, *greater than* + */ +inline fun T.greaterThan(value: T, action: (T) -> Unit) where T : Number, T : Comparable = gt(value, action) + +/** + * `it >= value`, *greater than or equal* + */ +inline fun T.ge(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this >= value) action(this) +} + +/** + * `it >= value`, *greater than or equal* + */ +inline fun T.greaterThanOrEqual(value: T, action: (T) -> Unit) where T : Number, T : Comparable = + ge(value, action) + +/** + * `it < value`, *less than* + */ +inline fun T.lt(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this < value) action(this) +} + +/** + * `it < value`, *less than* + */ +inline fun T.lessThan(value: T, action: (T) -> Unit) where T : Number, T : Comparable = lt(value, action) + +/** + * `it <= value`, *less than or equal* + */ +inline fun T.le(value: T, action: (T) -> Unit) where T : Number, T : Comparable { + if (this <= value) action(this) +} + +/** + * `it <= value`, *less than or equal* + */ +inline fun T.lessThanOrEqual(value: T, action: (T) -> Unit) where T : Number, T : Comparable = le(value, action) diff --git a/util/src/test/kotlin/com/socros/android/lib/util/MathExtensionsTest.kt b/util/src/test/kotlin/com/socros/android/lib/util/MathExtensionsTest.kt new file mode 100644 index 0000000..19ee0c6 --- /dev/null +++ b/util/src/test/kotlin/com/socros/android/lib/util/MathExtensionsTest.kt @@ -0,0 +1,33 @@ +package com.socros.android.lib.util + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test + +class MathExtensionsTest { + + @get:Rule + val repeatRule = RepeatRule() + + @Test + @Repeat(100) + fun rangeRandomValueTest() { + val random = (0..10).random() + assertTrue(random in 0..10) + } + + @Test + fun singleValueRangeTest() { + val random = (10..10).random() + assertEquals(10, random) + } + + @Test + fun decreasedRangeRandomValueTest() { + @Suppress("EmptyRange") + val random = (5..-5).random() + assertEquals(5, random) + } + +} diff --git a/util/src/test/kotlin/com/socros/android/lib/util/Repeat.kt b/util/src/test/kotlin/com/socros/android/lib/util/Repeat.kt new file mode 100644 index 0000000..31cf6ef --- /dev/null +++ b/util/src/test/kotlin/com/socros/android/lib/util/Repeat.kt @@ -0,0 +1,6 @@ +package com.socros.android.lib.util + +@Retention() +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.ANNOTATION_CLASS) +annotation class Repeat(val value: Int) diff --git a/util/src/test/kotlin/com/socros/android/lib/util/RepeatRule.kt b/util/src/test/kotlin/com/socros/android/lib/util/RepeatRule.kt new file mode 100644 index 0000000..acbb159 --- /dev/null +++ b/util/src/test/kotlin/com/socros/android/lib/util/RepeatRule.kt @@ -0,0 +1,27 @@ +package com.socros.android.lib.util + +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +class RepeatRule : TestRule { + + private class RepeatStatement(private val statement: Statement, private val repeat: Int) : Statement() { + @Throws(Throwable::class) + override fun evaluate() { + for (i in 0 until repeat) { + statement.evaluate() + } + } + } + + override fun apply(statement: Statement, description: Description): Statement { + var result = statement + val repeat = description.getAnnotation(Repeat::class.java) + if (repeat != null) { + val times = repeat.value + result = RepeatStatement(statement, times) + } + return result + } +} From 39154fb24a2fba7b83cf2cb2fb4cbd5065ce21ec Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 13:37:26 +0200 Subject: [PATCH 033/151] Add some View extensions --- build.gradle | 1 + util/build.gradle | 1 + .../com/socros/android/lib/util/ViewExt.kt | 70 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 util/src/main/kotlin/com/socros/android/lib/util/ViewExt.kt diff --git a/build.gradle b/build.gradle index 305330b..14ce1d7 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { compileSdkVersion = 28 buildToolsVersion = '27.0.3' appCompatVersion = '1.0.0-rc02' + supportAnnotationsVersion = '1.0.0-rc02' materialVersion = '1.0.0-rc02' rxJavaVersion = '2.1.14' rxAndroidVersion = '2.0.1' diff --git a/util/build.gradle b/util/build.gradle index 6227f16..57b0be5 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -45,6 +45,7 @@ dependencies { // Support implementation "androidx.appcompat:appcompat:$appCompatVersion" + implementation "androidx.annotation:annotation:$supportAnnotationsVersion" // Reactive implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion" diff --git a/util/src/main/kotlin/com/socros/android/lib/util/ViewExt.kt b/util/src/main/kotlin/com/socros/android/lib/util/ViewExt.kt new file mode 100644 index 0000000..e0b798a --- /dev/null +++ b/util/src/main/kotlin/com/socros/android/lib/util/ViewExt.kt @@ -0,0 +1,70 @@ +package com.socros.android.lib.util + +import android.view.View +import android.view.ViewStub +import android.view.ViewTreeObserver +import androidx.annotation.IdRes + +/* MAIN UTILS */ + +enum class Visibility(val intValue: Int) { + GONE(View.GONE), + INVISIBLE(View.INVISIBLE), + VISIBLE(View.VISIBLE); + + companion object : EnumValueCompanion( + Visibility.values().associateBy(Visibility::intValue), GONE) +} + +inline var View.visible: Boolean + get() = visibility == View.VISIBLE + set(value) { + visibility = if (value) View.VISIBLE else View.GONE + } + +inline var View.visibilityEnum: Visibility + get() = Visibility.fromValue(visibility) + set(value) { + visibility = value.intValue + } + +val View.hasTag: Boolean + get() = tag != null + +inline fun T.afterMeasured(crossinline action: T.() -> Unit) { + if (measuredWidth > 0 || measuredHeight > 0) { + action() + + } else { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + if (measuredWidth > 0 || measuredHeight > 0) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + action() + } + } + }) + } +} + +val ViewStub.inflated: Boolean + get() = parent == null + +fun View.traverseUpToFindParent(@IdRes id: Int): View? { + return traverseUpToFindParent { this.id == id } +} + +fun View.traverseUpToFindParentOrThrow(@IdRes id: Int): View { + return traverseUpToFindParent { this.id == id } + ?: throw IllegalArgumentException("Can't find parent with specified id!") +} + +tailrec fun View?.traverseUpToFindParent(predicate: View.() -> Boolean): View? { + return if (this == null || predicate(this)) this + else (parent as? View).traverseUpToFindParent(predicate) +} + +fun View?.traverseUpToFindParentOrThrow(predicate: View.() -> Boolean): View { + return this?.traverseUpToFindParent(predicate) + ?: throw IllegalArgumentException("Can't find parent with specified predicate!") +} From d736ea79d57da3d815d95b8570a5822dd9f0f7e4 Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 11 Sep 2018 13:42:47 +0200 Subject: [PATCH 034/151] Updated app resources --- app/src/main/res/values-v23/themes.xml | 2 +- app/src/main/res/values/colors.xml | 11 ++++------- app/src/main/res/values/themes.xml | 20 +++++++++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml index dfbad6b..f428def 100644 --- a/app/src/main/res/values-v23/themes.xml +++ b/app/src/main/res/values-v23/themes.xml @@ -4,7 +4,7 @@ \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b10477b..c045885 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,12 +6,12 @@ #5000 @color/github_gray900 - #4c5157 - @color/black + @color/github_gray800 + @color/black #ffb300 - #ffe54c - #c68400 + #ffe54c + #c68400 #24292e #3c4146 @@ -19,7 +19,4 @@ #eff4fc #fafbfc - #fff - #000 - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 544c608..a3a37ff 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -4,20 +4,34 @@ \ No newline at end of file diff --git a/base/src/main/res/values-v26/themes.xml b/base/src/main/res/values-v26/themes.xml new file mode 100644 index 0000000..15808c2 --- /dev/null +++ b/base/src/main/res/values-v26/themes.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/base/src/main/res/values-v27/themes.xml b/base/src/main/res/values-v27/themes.xml index 9fd5704..34d4f04 100644 --- a/base/src/main/res/values-v27/themes.xml +++ b/base/src/main/res/values-v27/themes.xml @@ -4,7 +4,7 @@ diff --git a/base/src/main/res/values/styles.xml b/base/src/main/res/values/styles.xml index 8542005..826b1c6 100644 --- a/base/src/main/res/values/styles.xml +++ b/base/src/main/res/values/styles.xml @@ -1,2 +1,20 @@ + + + + + + + diff --git a/base/src/main/res/values/themes.xml b/base/src/main/res/values/themes.xml index a3a37ff..6989ee1 100644 --- a/base/src/main/res/values/themes.xml +++ b/base/src/main/res/values/themes.xml @@ -16,7 +16,7 @@ From 4824747875d6bc49af7d304824e0e936498964e0 Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 20 Sep 2018 21:54:24 +0200 Subject: [PATCH 060/151] Simple ContentListActivity --- app/build.gradle | 1 + .../app/gitez/view/launcher/SplashActivity.kt | 3 +- contentsearch/.gitignore | 1 + contentsearch/build.gradle | 90 +++++++++++++++++++ contentsearch/src/main/AndroidManifest.xml | 12 +++ .../contentsearch/view/ContentListActivity.kt | 19 ++++ .../main/res/layout/content_list_activity.xml | 14 +++ .../src/main/res/values-pl/strings.xml | 5 ++ contentsearch/src/main/res/values/strings.xml | 5 ++ settings.gradle | 2 +- 10 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 contentsearch/.gitignore create mode 100644 contentsearch/build.gradle create mode 100644 contentsearch/src/main/AndroidManifest.xml create mode 100644 contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt create mode 100644 contentsearch/src/main/res/layout/content_list_activity.xml create mode 100644 contentsearch/src/main/res/values-pl/strings.xml create mode 100644 contentsearch/src/main/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index f8281a1..d96f624 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ dependencies { // Base implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':contentsearch') implementation project(':base') implementation project(':androidcore') implementation project(':tim') diff --git a/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt b/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt index 88b34a9..476ee4e 100644 --- a/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt +++ b/app/src/main/kotlin/com/socros/android/app/gitez/view/launcher/SplashActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import androidx.core.view.doOnPreDraw import com.socros.android.app.gitez.R +import com.socros.android.app.gitez.contentsearch.view.ContentListActivity import com.socros.android.lib.androidcore.view.launcher.ACSplashActivity import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.splash_activity.authorTxt @@ -31,7 +32,7 @@ class SplashActivity : ACSplashActivity() { } override fun provideNextActivity(): Intent { - return Intent(this, SplashActivity::class.java) + return Intent(this, ContentListActivity::class.java) } private fun initQuote() { diff --git a/contentsearch/.gitignore b/contentsearch/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/contentsearch/.gitignore @@ -0,0 +1 @@ +/build diff --git a/contentsearch/build.gradle b/contentsearch/build.gradle new file mode 100644 index 0000000..4fc6bb7 --- /dev/null +++ b/contentsearch/build.gradle @@ -0,0 +1,90 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + +android { + def rootExt = rootProject.ext + + compileSdkVersion rootExt.sdk.compile + buildToolsVersion rootExt.versions.buildTools + + defaultConfig { + minSdkVersion rootExt.sdk.min + targetSdkVersion rootExt.sdk.target + + versionCode generateVersionCode() + versionName generateVersionName() + + testInstrumentationRunner rootExt.testRunner + } + + buildTypes { + debug { + minifyEnabled false + useProguard false + shrinkResources false + } + + release { + minifyEnabled false + useProguard false + shrinkResources false + + files { rootProject.file('settings/proguard').listFiles() }.each { + proguardFile it + } + } + } + + sourceSets { + androidTest.java.srcDirs += 'src/androidTest/kotlin' + main.java.srcDirs += 'src/main/kotlin' + test.java.srcDirs += 'src/test/kotlin' + } +} + +androidExtensions { + experimental = true + defaultCacheImplementation = 'SPARSE_ARRAY' +} + +dependencies { + def rootExt = rootProject.ext + def appDependencies = rootExt.mainApplication + def unitTestDependencies = rootExt.unitTesting + def acceptanceTestDependencies = rootExt.acceptanceTesting + + // Base + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':base') + implementation project(':androidcore') + implementation project(':tim') + implementation project(':util') + implementation appDependencies.kotlin + + // Android + implementation appDependencies.appCompat + implementation appDependencies.coreKtx + implementation appDependencies.constraintLayout + implementation appDependencies.lifecycle + kapt appDependencies.lifecycleProcessor + + // Reactive + implementation appDependencies.rxJava + implementation appDependencies.rxAndroid + implementation appDependencies.rxKotlin + + // Other + implementation appDependencies.dagger + implementation appDependencies.daggerAndroid + kapt appDependencies.daggerProcessor + + // Unit/Integration tests + testImplementation unitTestDependencies.kotlin + testImplementation unitTestDependencies.kotlinTest + testImplementation unitTestDependencies.junit + + // Acceptance tests + androidTestImplementation acceptanceTestDependencies.testRunner +} diff --git a/contentsearch/src/main/AndroidManifest.xml b/contentsearch/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9dbaa00 --- /dev/null +++ b/contentsearch/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt b/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt new file mode 100644 index 0000000..14f6bf8 --- /dev/null +++ b/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt @@ -0,0 +1,19 @@ +package com.socros.android.app.gitez.contentsearch.view + +import android.annotation.SuppressLint +import android.os.Bundle +import com.socros.android.app.gitez.base.view.BaseActivity +import com.socros.android.app.gitez.contentsearch.R +import kotlinx.android.synthetic.main.content_list_activity.toolbar + +class ContentListActivity : BaseActivity() { + + override val layoutResId = R.layout.content_list_activity + + @SuppressLint("InlinedApi") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setSupportActionBar(toolbar) + } + +} diff --git a/contentsearch/src/main/res/layout/content_list_activity.xml b/contentsearch/src/main/res/layout/content_list_activity.xml new file mode 100644 index 0000000..ced1cca --- /dev/null +++ b/contentsearch/src/main/res/layout/content_list_activity.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/contentsearch/src/main/res/values-pl/strings.xml b/contentsearch/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000..91dd9bd --- /dev/null +++ b/contentsearch/src/main/res/values-pl/strings.xml @@ -0,0 +1,5 @@ + + Lorem ipsum + + Octocat jest smutny ponieważ jest tutaj tylko na pokaz + diff --git a/contentsearch/src/main/res/values/strings.xml b/contentsearch/src/main/res/values/strings.xml new file mode 100644 index 0000000..ebadea7 --- /dev/null +++ b/contentsearch/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + Lorem ipsum + + Octocat is sad because it\'s only as a placeholder + diff --git a/settings.gradle b/settings.gradle index 1ec34e9..967df5d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = "Gitez" -include ':app', ':base', ':androidcore', ':tim', ':util' +include ':app', ':contentsearch', ':base', ':androidcore', ':tim', ':util' From 06d0a2cc2ba0d4dc7a169eb8f0deadb206b09628 Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 20 Sep 2018 22:44:52 +0200 Subject: [PATCH 061/151] Add octocat placeholder --- .../res/drawable-mdpi/sadoctocat_img.webp | Bin 0 -> 8814 bytes .../res/drawable-xhdpi/sadoctocat_img.webp | Bin 0 -> 16358 bytes .../res/drawable-xxhdpi/sadoctocat_img.webp | Bin 0 -> 22324 bytes .../main/res/layout/content_list_activity.xml | 32 +++++++++++++++++- contentsearch/src/main/res/values/strings.xml | 3 +- 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 contentsearch/src/main/res/drawable-mdpi/sadoctocat_img.webp create mode 100644 contentsearch/src/main/res/drawable-xhdpi/sadoctocat_img.webp create mode 100644 contentsearch/src/main/res/drawable-xxhdpi/sadoctocat_img.webp diff --git a/contentsearch/src/main/res/drawable-mdpi/sadoctocat_img.webp b/contentsearch/src/main/res/drawable-mdpi/sadoctocat_img.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e9d4d6442c4e712cc467224201088b72b334685 GIT binary patch literal 8814 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 literal 0 HcmV?d00001 diff --git a/contentsearch/src/main/res/drawable-xxhdpi/sadoctocat_img.webp b/contentsearch/src/main/res/drawable-xxhdpi/sadoctocat_img.webp new file mode 100644 index 0000000000000000000000000000000000000000..6960784de968026afbcf9d55cb8d2894d409aab3 GIT binary patch literal 22324 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 literal 0 HcmV?d00001 diff --git a/contentsearch/src/main/res/layout/content_list_activity.xml b/contentsearch/src/main/res/layout/content_list_activity.xml index ced1cca..2284bdd 100644 --- a/contentsearch/src/main/res/layout/content_list_activity.xml +++ b/contentsearch/src/main/res/layout/content_list_activity.xml @@ -11,4 +11,34 @@ app:layout_constraintTop_toTopOf="parent" tools:title="Lorem ipsum" /> - \ No newline at end of file + + + + + diff --git a/contentsearch/src/main/res/values/strings.xml b/contentsearch/src/main/res/values/strings.xml index ebadea7..10a6b3e 100644 --- a/contentsearch/src/main/res/values/strings.xml +++ b/contentsearch/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ Lorem ipsum - Octocat is sad because it\'s only as a placeholder + Octocat + Octocat is sad because it\'s only a placeholder From 0e294b0a742f2c84cfef1582217fc853af22abb4 Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 20 Sep 2018 22:59:53 +0200 Subject: [PATCH 062/151] Show search icon --- .../gitez/contentsearch/view/ContentListActivity.kt | 8 ++++++-- .../main/res/drawable/ic_search_on_light_24dp.xml | 11 +++++++++++ contentsearch/src/main/res/menu/contentsearch.xml | 12 ++++++++++++ contentsearch/src/main/res/values-pl/strings.xml | 1 + contentsearch/src/main/res/values/strings.xml | 1 + 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 contentsearch/src/main/res/drawable/ic_search_on_light_24dp.xml create mode 100644 contentsearch/src/main/res/menu/contentsearch.xml diff --git a/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt b/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt index 14f6bf8..7aba685 100644 --- a/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt +++ b/contentsearch/src/main/kotlin/com/socros/android/app/gitez/contentsearch/view/ContentListActivity.kt @@ -1,7 +1,7 @@ package com.socros.android.app.gitez.contentsearch.view -import android.annotation.SuppressLint import android.os.Bundle +import android.view.Menu import com.socros.android.app.gitez.base.view.BaseActivity import com.socros.android.app.gitez.contentsearch.R import kotlinx.android.synthetic.main.content_list_activity.toolbar @@ -10,10 +10,14 @@ class ContentListActivity : BaseActivity() { override val layoutResId = R.layout.content_list_activity - @SuppressLint("InlinedApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setSupportActionBar(toolbar) } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.contentsearch, menu) + return super.onCreateOptionsMenu(menu) + } + } diff --git a/contentsearch/src/main/res/drawable/ic_search_on_light_24dp.xml b/contentsearch/src/main/res/drawable/ic_search_on_light_24dp.xml new file mode 100644 index 0000000..590bbab --- /dev/null +++ b/contentsearch/src/main/res/drawable/ic_search_on_light_24dp.xml @@ -0,0 +1,11 @@ + + + + diff --git a/contentsearch/src/main/res/menu/contentsearch.xml b/contentsearch/src/main/res/menu/contentsearch.xml new file mode 100644 index 0000000..61ecff1 --- /dev/null +++ b/contentsearch/src/main/res/menu/contentsearch.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/contentsearch/src/main/res/values-pl/strings.xml b/contentsearch/src/main/res/values-pl/strings.xml index 91dd9bd..03d7b76 100644 --- a/contentsearch/src/main/res/values-pl/strings.xml +++ b/contentsearch/src/main/res/values-pl/strings.xml @@ -1,5 +1,6 @@ Lorem ipsum + Szukaj Octocat jest smutny ponieważ jest tutaj tylko na pokaz diff --git a/contentsearch/src/main/res/values/strings.xml b/contentsearch/src/main/res/values/strings.xml index 10a6b3e..917ca56 100644 --- a/contentsearch/src/main/res/values/strings.xml +++ b/contentsearch/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Lorem ipsum + Search Octocat Octocat is sad because it\'s only a placeholder From 51dbfa364a70da2920786d6e542edfe147e6c6d1 Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 20 Sep 2018 23:00:12 +0200 Subject: [PATCH 063/151] Naming refactor --- .../{sadoctocat_img.webp => img_sadoctocat.webp} | Bin .../{sadoctocat_img.webp => img_sadoctocat.webp} | Bin .../{sadoctocat_img.webp => img_sadoctocat.webp} | Bin .../src/main/res/layout/content_list_activity.xml | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename contentsearch/src/main/res/drawable-mdpi/{sadoctocat_img.webp => img_sadoctocat.webp} (100%) rename contentsearch/src/main/res/drawable-xhdpi/{sadoctocat_img.webp => img_sadoctocat.webp} (100%) rename contentsearch/src/main/res/drawable-xxhdpi/{sadoctocat_img.webp => img_sadoctocat.webp} (100%) diff --git a/contentsearch/src/main/res/drawable-mdpi/sadoctocat_img.webp b/contentsearch/src/main/res/drawable-mdpi/img_sadoctocat.webp similarity index 100% rename from contentsearch/src/main/res/drawable-mdpi/sadoctocat_img.webp rename to contentsearch/src/main/res/drawable-mdpi/img_sadoctocat.webp diff --git a/contentsearch/src/main/res/drawable-xhdpi/sadoctocat_img.webp b/contentsearch/src/main/res/drawable-xhdpi/img_sadoctocat.webp similarity index 100% rename from contentsearch/src/main/res/drawable-xhdpi/sadoctocat_img.webp rename to contentsearch/src/main/res/drawable-xhdpi/img_sadoctocat.webp diff --git a/contentsearch/src/main/res/drawable-xxhdpi/sadoctocat_img.webp b/contentsearch/src/main/res/drawable-xxhdpi/img_sadoctocat.webp similarity index 100% rename from contentsearch/src/main/res/drawable-xxhdpi/sadoctocat_img.webp rename to contentsearch/src/main/res/drawable-xxhdpi/img_sadoctocat.webp diff --git a/contentsearch/src/main/res/layout/content_list_activity.xml b/contentsearch/src/main/res/layout/content_list_activity.xml index 2284bdd..f531684 100644 --- a/contentsearch/src/main/res/layout/content_list_activity.xml +++ b/contentsearch/src/main/res/layout/content_list_activity.xml @@ -18,7 +18,7 @@ android:layout_marginTop="@dimen/activityMargin_vertical" android:adjustViewBounds="true" android:contentDescription="@string/contentSearch_octocat" - android:src="@drawable/sadoctocat_img" + android:src="@drawable/img_sadoctocat" app:layout_constraintBottom_toTopOf="@id/placeholderTxt" app:layout_constraintDimensionRatio="1.2" app:layout_constraintEnd_toEndOf="parent" From dd0ce693005ed3cc81aaa124dc3722dbe71c310e Mon Sep 17 00:00:00 2001 From: sos Date: Thu, 20 Sep 2018 23:59:54 +0200 Subject: [PATCH 064/151] Show SearchBar --- contentsearch/src/main/res/menu/contentsearch.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contentsearch/src/main/res/menu/contentsearch.xml b/contentsearch/src/main/res/menu/contentsearch.xml index 61ecff1..54b56c7 100644 --- a/contentsearch/src/main/res/menu/contentsearch.xml +++ b/contentsearch/src/main/res/menu/contentsearch.xml @@ -7,6 +7,7 @@ android:id="@+id/actionSearch" android:icon="@drawable/ic_search_on_light_24dp" android:title="@string/contentSearch_actionSearch" - app:showAsAction="ifRoom" /> + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="ifRoom|collapseActionView" /> From 65d1cada1d6d8aa86c3bc715c37d6798fdc7c916 Mon Sep 17 00:00:00 2001 From: sos Date: Fri, 21 Sep 2018 00:00:05 +0200 Subject: [PATCH 065/151] Add search button in the placeholder --- app/src/main/res/values-pl/splash_quotes.xml | 2 +- .../main/res/layout/content_list_activity.xml | 31 ++++++++++++++++--- .../src/main/res/values-pl/strings.xml | 3 +- contentsearch/src/main/res/values/strings.xml | 3 +- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-pl/splash_quotes.xml b/app/src/main/res/values-pl/splash_quotes.xml index 6e9848b..1ef8db1 100644 --- a/app/src/main/res/values-pl/splash_quotes.xml +++ b/app/src/main/res/values-pl/splash_quotes.xml @@ -5,7 +5,7 @@ Każda świetna aplikacja \n potrzebuje ekranu startowego - Kod nigdy nie kłamie, \n komentarze czasami tak + Kod nigdy nie kłamie, \n komentarze czasami Najpierw rozwiąż problem. \n Następnie napisz kod. Programowanie to myślenie \n a nie pisanie diff --git a/contentsearch/src/main/res/layout/content_list_activity.xml b/contentsearch/src/main/res/layout/content_list_activity.xml index f531684..273c030 100644 --- a/contentsearch/src/main/res/layout/content_list_activity.xml +++ b/contentsearch/src/main/res/layout/content_list_activity.xml @@ -8,9 +8,17 @@ + + +