Merge branch 'master' into dev
53
.github/workflows/publish.yml
vendored
@@ -1,53 +0,0 @@
|
|||||||
name: Build, Test & Publish
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: macOS-latest
|
|
||||||
env:
|
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: Install GPG
|
|
||||||
uses: olafurpg/setup-gpg@v2
|
|
||||||
|
|
||||||
- name: Decrypt secrets
|
|
||||||
env:
|
|
||||||
GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }}
|
|
||||||
run: .secret/decrypt.sh
|
|
||||||
|
|
||||||
- name: Install Java Development Kit 1.8
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 1.8
|
|
||||||
|
|
||||||
- name: Install flock
|
|
||||||
run: brew install util-linux
|
|
||||||
|
|
||||||
- name: Build APK & Run small tests
|
|
||||||
env:
|
|
||||||
RELEASE: 1
|
|
||||||
run: ./build.sh build
|
|
||||||
|
|
||||||
- name: Run medium tests
|
|
||||||
uses: ReactiveCircus/android-emulator-runner@v2.2.0
|
|
||||||
env:
|
|
||||||
RELEASE: 1
|
|
||||||
with:
|
|
||||||
api-level: 29
|
|
||||||
script: ./build.sh medium-tests
|
|
||||||
|
|
||||||
- name: Upload build to GitHub
|
|
||||||
uses: actions/upload-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Build
|
|
||||||
path: uhabits-android/uhabits-android/build/outputs/
|
|
||||||
|
|
||||||
- name: Upload APK to Google Play
|
|
||||||
run: cd uhabits-android && ./gradlew publishReleaseApk
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [2.0.1] - 2021-04-30
|
## [2.0.1] - 2021-05-09
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Make midnight delay optional and disabled by default (@hiqua)
|
- Make midnight delay optional and disabled by default (@hiqua)
|
||||||
|
|||||||
24
README.md
@@ -111,18 +111,18 @@ contribute, even if you are not a software developer.
|
|||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
[screen1]: screenshots/uhabits1.png
|
[screen1]: screenshots/1.png
|
||||||
[screen2]: screenshots/uhabits2.png
|
[screen2]: screenshots/2.png
|
||||||
[screen3]: screenshots/uhabits3.png
|
[screen3]: screenshots/3.png
|
||||||
[screen4]: screenshots/uhabits4.png
|
[screen4]: screenshots/4.png
|
||||||
[screen5]: screenshots/uhabits5.png
|
[screen5]: screenshots/5.png
|
||||||
[screen6]: screenshots/uhabits6.png
|
[screen6]: screenshots/6.png
|
||||||
[screen1th]: screenshots/uhabits1_th.png
|
[screen1th]: screenshots/1.thumb.png
|
||||||
[screen2th]: screenshots/uhabits2_th.png
|
[screen2th]: screenshots/2.thumb.png
|
||||||
[screen3th]: screenshots/uhabits3_th.png
|
[screen3th]: screenshots/3.thumb.png
|
||||||
[screen4th]: screenshots/uhabits4_th.png
|
[screen4th]: screenshots/4.thumb.png
|
||||||
[screen5th]: screenshots/uhabits5_th.png
|
[screen5th]: screenshots/5.thumb.png
|
||||||
[screen6th]: screenshots/uhabits6_th.png
|
[screen6th]: screenshots/6.thumb.png
|
||||||
[poedit]: http://translate.loophabits.org
|
[poedit]: http://translate.loophabits.org
|
||||||
[playstore]: https://play.google.com/store/apps/details?id=org.isoron.uhabits
|
[playstore]: https://play.google.com/store/apps/details?id=org.isoron.uhabits
|
||||||
[releases]: https://github.com/iSoron/uhabits/releases
|
[releases]: https://github.com/iSoron/uhabits/releases
|
||||||
|
|||||||
BIN
screenshots/1.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
screenshots/1.thumb.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
screenshots/2.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
screenshots/2.thumb.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
screenshots/3.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
screenshots/3.thumb.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
screenshots/4.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
screenshots/4.thumb.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
screenshots/5.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
screenshots/5.thumb.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
screenshots/6.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
screenshots/6.thumb.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 28 KiB |
@@ -26,7 +26,6 @@ task("updateTranslators") {
|
|||||||
val name = entry["Name"]!!
|
val name = entry["Name"]!!
|
||||||
if (!translators.containsKey(lang)) {
|
if (!translators.containsKey(lang)) {
|
||||||
translators[lang] = mutableListOf()
|
translators[lang] = mutableListOf()
|
||||||
println(lang)
|
|
||||||
}
|
}
|
||||||
translators[lang]!!.add(name)
|
translators[lang]!!.add(name)
|
||||||
translators[lang]!!.sort()
|
translators[lang]!!.sort()
|
||||||
@@ -87,7 +86,6 @@ task("updateTranslators") {
|
|||||||
}
|
}
|
||||||
if (!translators.containsKey(lang)) {
|
if (!translators.containsKey(lang)) {
|
||||||
translators[lang] = mutableListOf()
|
translators[lang] = mutableListOf()
|
||||||
println(lang)
|
|
||||||
}
|
}
|
||||||
if (translators[lang]!!.contains(name)) continue
|
if (translators[lang]!!.contains(name)) continue
|
||||||
translators[lang]!!.add(name)
|
translators[lang]!!.add(name)
|
||||||
|
|||||||
@@ -45,10 +45,24 @@ android {
|
|||||||
testInstrumentationRunner("androidx.test.runner.AndroidJUnitRunner")
|
testInstrumentationRunner("androidx.test.runner.AndroidJUnitRunner")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
if (System.getenv("LOOP_KEY_ALIAS") != null) {
|
||||||
|
create("release") {
|
||||||
|
keyAlias = System.getenv("LOOP_KEY_ALIAS")
|
||||||
|
keyPassword = System.getenv("LOOP_KEY_PASSWORD")
|
||||||
|
storeFile = file(System.getenv("LOOP_KEY_STORE"))
|
||||||
|
storePassword = System.getenv("LOOP_STORE_PASSWORD")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
getByName("release") {
|
getByName("release") {
|
||||||
minifyEnabled(true)
|
minifyEnabled(true)
|
||||||
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.txt")
|
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.txt")
|
||||||
|
if (signingConfigs.findByName("release") != null) {
|
||||||
|
signingConfig = signingConfigs.getByName("release")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getByName("debug") {
|
getByName("debug") {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import org.isoron.uhabits.inject.HabitsApplicationComponent
|
|||||||
import org.isoron.uhabits.utils.InterfaceUtils.getDimension
|
import org.isoron.uhabits.utils.InterfaceUtils.getDimension
|
||||||
import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
class CheckmarkWidgetView : HabitWidgetView {
|
class CheckmarkWidgetView : HabitWidgetView {
|
||||||
@@ -95,7 +96,7 @@ class CheckmarkWidgetView : HabitWidgetView {
|
|||||||
|
|
||||||
private val text: String
|
private val text: String
|
||||||
get() = if (isNumerical) {
|
get() = if (isNumerical) {
|
||||||
(entryValue / 1000.0).toShortString()
|
(max(0, entryValue) / 1000.0).toShortString()
|
||||||
} else when (entryState) {
|
} else when (entryState) {
|
||||||
YES_MANUAL, YES_AUTO -> resources.getString(R.string.fa_check)
|
YES_MANUAL, YES_AUTO -> resources.getString(R.string.fa_check)
|
||||||
SKIP -> resources.getString(R.string.fa_skipped)
|
SKIP -> resources.getString(R.string.fa_skipped)
|
||||||
@@ -130,7 +131,11 @@ class CheckmarkWidgetView : HabitWidgetView {
|
|||||||
val maxTextSize = getDimension(context, R.dimen.smallerTextSize)
|
val maxTextSize = getDimension(context, R.dimen.smallerTextSize)
|
||||||
textSize = min(textSize, maxTextSize)
|
textSize = min(textSize, maxTextSize)
|
||||||
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
||||||
ring.setTextSize(textSize)
|
if (isNumerical) {
|
||||||
|
ring.setTextSize(textSize * 0.75f)
|
||||||
|
} else {
|
||||||
|
ring.setTextSize(textSize)
|
||||||
|
}
|
||||||
ring.setThickness(0.15f * textSize)
|
ring.setThickness(0.15f * textSize)
|
||||||
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec)
|
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec)
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 2.0 MiB |
@@ -1,3 +1,10 @@
|
|||||||
1.8.12:
|
2.0:
|
||||||
* Fix bug that caused incorrect check marks to show after scrolling
|
* Track numeric habits (e.g. how many pages did you read?)
|
||||||
* Fix issue preventing widgets from updating at midnight
|
* Skip days without breaking your streak
|
||||||
|
* Show question marks for days with missing data
|
||||||
|
* Extend day a few hours past midnight
|
||||||
|
* Show multiple habits in a single widget
|
||||||
|
* Export daily backups automatically
|
||||||
|
* Sort habits by status and in reverse
|
||||||
|
* Add notes to habits
|
||||||
|
* Improve theme and accessibility
|
||||||
|
|||||||