Fix ktlint setup

This commit is contained in:
Phillip Thelen 2022-03-31 15:07:59 +02:00
parent 890345ae49
commit ddd7927c4f
238 changed files with 1264 additions and 963 deletions

View file

@ -2,14 +2,12 @@ name: Android CI
on: on:
push: push:
branches: [ develop ] branches: [ develop, release ]
pull_request: pull_request:
branches: [ develop ]
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: set up JDK 11 - name: set up JDK 11
@ -18,29 +16,17 @@ jobs:
java-version: '11' java-version: '11'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: Prepare
run: ./.github/actions/prepare-run
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action
- name: Run with Gradle
uses: gradle/gradle-build-action
with:
arguments: assembleProdDebug -PdisablePreDex
- name: Grant execute permission for gradlew unit-test:
run: chmod +x gradlew
- name: copy properties file
uses: canastro/copy-file-action@master
with:
source: "habitica.properties.example"
target: "habitica.properties"
- name: copy resources file
uses: canastro/copy-file-action@master
with:
source: "habitica.resources.example"
target: "habitica.resources"
- name: copy google services file
uses: canastro/copy-file-action@master
with:
source: "Habitica/google-services.json.example"
target: "Habitica/google-services.json"
- name: Build with Gradle
run: ./gradlew assembleProdDebug -PdisablePreDex
test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: set up JDK 11 - name: set up JDK 11
@ -49,28 +35,36 @@ jobs:
java-version: '11' java-version: '11'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: Grant execute permission for gradlew - name: Prepare
run: chmod +x gradlew run: ./.github/actions/prepare-run
- name: copy properties file - name: Validate Gradle wrapper
uses: canastro/copy-file-action@master uses: gradle/wrapper-validation-action
- name: Run with Gradle
uses: gradle/gradle-build-action
with: with:
source: "habitica.properties.example" arguments: testProdDebugUnitTest
target: "habitica.properties"
- name: copy resources file ui-test:
uses: canastro/copy-file-action@master runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: set up JDK 11
uses: actions/setup-java@v2
with: with:
source: "habitica.resources.example" java-version: '11'
target: "habitica.resources" distribution: 'adopt'
- name: copy google services file cache: gradle
uses: canastro/copy-file-action@master - name: Prepare
run: ./.github/actions/prepare-run
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action
- name: Run with Gradle
uses: gradle/gradle-build-action
with: with:
source: "Habitica/google-services.json.example" arguments: testProdDebugUnitTest
target: "Habitica/google-services.json"
- name: Run Tests
run: ./gradlew testProdDebugUnitTest
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: set up JDK 11 - name: set up JDK 11
@ -79,28 +73,17 @@ jobs:
java-version: '11' java-version: '11'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: copy properties file - name: Prepare
uses: canastro/copy-file-action@master run: ./.github/actions/prepare-run
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action
- name: Run with Gradle
uses: gradle/gradle-build-action
with: with:
source: "habitica.properties.example" arguments: ktlint
target: "habitica.properties"
- name: copy resources file
uses: canastro/copy-file-action@master
with:
source: "habitica.resources.example"
target: "habitica.resources"
- name: copy google services file
uses: canastro/copy-file-action@master
with:
source: "Habitica/google-services.json.example"
target: "Habitica/google-services.json"
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Run Ktlint
run: ./gradlew ktlint
detekt: detekt:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: set up JDK 11 - name: set up JDK 11
@ -109,25 +92,14 @@ jobs:
java-version: '11' java-version: '11'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: copy properties file - name: Prepare
uses: canastro/copy-file-action@master run: ./.github/actions/prepare-run
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action
- name: Run with Gradle
uses: gradle/gradle-build-action
with: with:
source: "habitica.properties.example" arguments: detekt
target: "habitica.properties"
- name: copy resources file
uses: canastro/copy-file-action@master
with:
source: "habitica.resources.example"
target: "habitica.resources"
- name: copy google services file
uses: canastro/copy-file-action@master
with:
source: "Habitica/google-services.json.example"
target: "Habitica/google-services.json"
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Run detekt
run: ./gradlew detekt
- name: Upload SARIF to Github using the upload-sarif action - name: Upload SARIF to Github using the upload-sarif action
uses: github/codeql-action/upload-sarif@v1 uses: github/codeql-action/upload-sarif@v1
if: ${{ always() }} if: ${{ always() }}

View file

@ -49,7 +49,6 @@ dependencies {
implementation 'com.google.dagger:dagger:2.40.5' implementation 'com.google.dagger:dagger:2.40.5'
kapt 'com.google.dagger:dagger-compiler:2.40.5' kapt 'com.google.dagger:dagger-compiler:2.40.5'
compileOnly 'javax.annotation:javax.annotation-api:1.3.2' compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
compileOnly 'com.github.pengrad:jdk9-deps:1.0'
//App Compatibility and Material Design //App Compatibility and Material Design
implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0' implementation 'com.google.android.material:material:1.5.0'
@ -66,7 +65,7 @@ dependencies {
// IAP Handling / Verification // IAP Handling / Verification
implementation "com.android.billingclient:billing-ktx:4.0.0" implementation "com.android.billingclient:billing-ktx:4.1.0"
//Facebook //Facebook
implementation('com.facebook.android:facebook-android-sdk:12.2.0') { implementation('com.facebook.android:facebook-android-sdk:12.2.0') {
transitive = true transitive = true
@ -96,17 +95,18 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0' androidTestImplementation 'androidx.test:rules:1.4.0'
debugImplementation 'androidx.fragment:fragment-testing:1.4.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation "io.mockk:mockk-android:1.12.2" androidTestImplementation "io.mockk:mockk-android:1.12.2"
androidTestUtil("androidx.test:orchestrator:1.4.1")
implementation 'androidx.activity:activity-compose:1.4.0' implementation 'androidx.activity:activity-compose:1.4.0'
implementation 'androidx.compose.material:material:1.0.5' implementation 'androidx.compose.material:material:1.1.1'
implementation 'androidx.compose.animation:animation:1.0.5' implementation 'androidx.compose.animation:animation:1.1.1'
implementation 'androidx.compose.ui:ui-tooling:1.0.5' implementation 'androidx.compose.ui:ui-tooling:1.1.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1'
implementation "com.google.accompanist:accompanist-appcompat-theme:0.16.0" implementation "com.google.accompanist:accompanist-appcompat-theme:0.16.0"
//Leak Detection //Leak Detection
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8'
//Push Notifications //Push Notifications
@ -125,9 +125,8 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-common-java8:2.4.1" implementation "androidx.lifecycle:lifecycle-common-java8:2.4.1"
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2'
implementation "androidx.fragment:fragment-ktx:1.4.1" implementation "androidx.fragment:fragment-ktx:1.4.1"
implementation "androidx.paging:paging-runtime-ktx:3.1.0" implementation "androidx.paging:paging-runtime-ktx:3.1.1"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
@ -135,7 +134,7 @@ dependencies {
implementation project(':shared') implementation project(':shared')
ktlint("com.pinterest:ktlint:0.43.2") { ktlint("com.pinterest:ktlint:0.45.0") {
attributes { attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL)) attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
} }
@ -165,6 +164,7 @@ android {
targetSdkVersion 32 targetSdkVersion 32
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments clearPackageData: 'true'
} }
buildFeatures { buildFeatures {
@ -198,7 +198,6 @@ android {
// Disable fabric build ID generation for debug builds // Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false ext.enableCrashlytics = false
ext.alwaysUpdateBuildId = false ext.alwaysUpdateBuildId = false
testCoverageEnabled = true
resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider" resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
resValue "string", "app_name", "Habitica Debug" resValue "string", "app_name", "Habitica Debug"
} }
@ -251,12 +250,6 @@ android {
res.srcDirs = ['res'] res.srcDirs = ['res']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
} }
/*robolectric {
manifest.srcFile 'AndroidManifestTesting.xml'
java.srcDir file('src/test/java/')
res.srcDirs = ['res']
}*/
//instrumentTest.setRoot('tests')
debugIAP { java.srcDirs = ['src/debug/java'] } debugIAP { java.srcDirs = ['src/debug/java'] }
release { java.srcDirs = ['src/release/java'] } release { java.srcDirs = ['src/release/java'] }
} }
@ -292,6 +285,9 @@ android.testOptions {
useJUnitPlatform() useJUnitPlatform()
unitTests.returnDefaultValues = true unitTests.returnDefaultValues = true
} }
unitTests.returnDefaultValues = true
execution 'ANDROIDX_TEST_ORCHESTRATOR'
} }
Properties props = new Properties() Properties props = new Properties()
@ -315,7 +311,7 @@ if (propFile.canRead()) {
} }
// Add Habitica Properties to buildConfigField // Add Habitica Properties to buildConfigField
final File HRPG_PROPS_FILE = new File('habitica.properties') final File HRPG_PROPS_FILE = new File(projectDir.absolutePath + '/../habitica.properties')
if (HRPG_PROPS_FILE.canRead()) { if (HRPG_PROPS_FILE.canRead()) {
Properties HRPG_PROPS = new Properties() Properties HRPG_PROPS = new Properties()
HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE)) HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE))
@ -334,7 +330,7 @@ if (HRPG_PROPS_FILE.canRead()) {
} }
// Add Habitica Resources to resources // Add Habitica Resources to resources
final File HRPG_RES_FILE = new File('habitica.resources') final File HRPG_RES_FILE = new File(projectDir.absolutePath + '/../habitica.resources')
if (HRPG_RES_FILE.canRead()) { if (HRPG_RES_FILE.canRead()) {
Properties HRPG_RES = new Properties() Properties HRPG_RES = new Properties()
HRPG_RES.load(new FileInputStream(HRPG_RES_FILE)) HRPG_RES.load(new FileInputStream(HRPG_RES_FILE))
@ -404,6 +400,7 @@ task jacocoTestReport(type: JacocoReport, dependsOn: 'testProdDebugUnitTest') {
task ktlint(type: JavaExec, group: "verification") { task ktlint(type: JavaExec, group: "verification") {
description = "Check Kotlin code style." description = "Check Kotlin code style."
classpath = configurations.ktlint classpath = configurations.ktlint
mainClass.set("com.pinterest.ktlint.Main")
args "--disabled_rules=no-wildcard-imports", "--reporter=plain?group_by_file", "src/**/*.kt" args "--disabled_rules=no-wildcard-imports", "--reporter=plain?group_by_file", "src/**/*.kt"
// to generate report in checkstyle format prepend following args: // to generate report in checkstyle format prepend following args:
// "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/ktlint.xml" // "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/ktlint.xml"
@ -416,5 +413,6 @@ check.dependsOn ktlint
task ktlintFormat(type: JavaExec, group: "formatting") { task ktlintFormat(type: JavaExec, group: "formatting") {
description = "Fix Kotlin code style deviations." description = "Fix Kotlin code style deviations."
classpath = configurations.ktlint classpath = configurations.ktlint
args "--disabled_rules=no-wildcard-imports", "-F", "src/**/*.kt" mainClass.set("com.pinterest.ktlint.Main")
args "-F", "src/**/*.kt"
} }

Binary file not shown.

View file

@ -10,14 +10,14 @@ import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
class IntroActivityScreen: Screen<IntroActivityScreen>() { class IntroActivityScreen : Screen<IntroActivityScreen>() {
val skipButton = KButton { withId(R.id.skipButton) } val skipButton = KButton { withId(R.id.skipButton) }
val finishButton = KButton { withId(R.id.finishButton )} val finishButton = KButton { withId(R.id.finishButton) }
} }
@LargeTest @LargeTest
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class IntroActivityTest: TestCase() { class IntroActivityTest : TestCase() {
@Rule @Rule
@JvmField @JvmField

View file

@ -7,10 +7,8 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.TutorialRepository import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.kakao.screen.Screen import io.github.kakaocup.kakao.screen.Screen
import io.mockk.clearAllMocks import io.mockk.clearAllMocks
@ -21,7 +19,7 @@ import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import org.junit.Before import org.junit.Before
abstract class FragmentTestCase<F: BaseFragment<VB>, VB: ViewBinding, S: Screen<S>>: TestCase() { abstract class FragmentTestCase<F : BaseFragment<VB>, VB : ViewBinding, S : Screen<S>> : TestCase() {
lateinit var scenario: FragmentScenario<F> lateinit var scenario: FragmentScenario<F>
lateinit var fragment: F lateinit var fragment: F
@ -50,4 +48,4 @@ abstract class FragmentTestCase<F: BaseFragment<VB>, VB: ViewBinding, S: Screen<
every { userRepository.getUser() } returns userEvents every { userRepository.getUser() } returns userEvents
makeFragment() makeFragment()
} }
} }

View file

@ -20,7 +20,7 @@ import io.reactivex.rxjava3.core.Flowable
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
class PartyDetailScreen: Screen<PartyDetailScreen>() { class PartyDetailScreen : Screen<PartyDetailScreen>() {
val titleView = KTextView { withId(R.id.title_view) } val titleView = KTextView { withId(R.id.title_view) }
val newQuestButton = KButton { withId(R.id.new_quest_button) } val newQuestButton = KButton { withId(R.id.new_quest_button) }
val questDetailButton = KButton { withId(R.id.quest_detail_button) } val questDetailButton = KButton { withId(R.id.quest_detail_button) }
@ -30,7 +30,7 @@ class PartyDetailScreen: Screen<PartyDetailScreen>() {
@LargeTest @LargeTest
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPartyDetailBinding, PartyDetailScreen>() { class PartyDetailFragmentTest : FragmentTestCase<PartyDetailFragment, FragmentPartyDetailBinding, PartyDetailScreen>() {
private lateinit var viewModel: PartyViewModel private lateinit var viewModel: PartyViewModel
override val screen = PartyDetailScreen() override val screen = PartyDetailScreen()
@ -41,7 +41,7 @@ class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPar
viewModel = PartyViewModel(false) viewModel = PartyViewModel(false)
viewModel.socialRepository = socialRepository viewModel.socialRepository = socialRepository
viewModel.userRepository = userRepository viewModel.userRepository = userRepository
viewModel.notificationsManager= mockk(relaxed = true) viewModel.notificationsManager = mockk(relaxed = true)
scenario = launchFragmentInContainer(null, R.style.MainAppTheme) { scenario = launchFragmentInContainer(null, R.style.MainAppTheme) {
fragment = spyk() fragment = spyk()
fragment.shouldInitializeComponent = false fragment.shouldInitializeComponent = false
@ -61,4 +61,4 @@ class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPar
titleView.hasText("Group Name") titleView.hasText("Group Name")
} }
} }
} }

View file

@ -5,7 +5,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest import androidx.test.filters.LargeTest
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.FragmentStatsBinding import com.habitrpg.android.habitica.databinding.FragmentStatsBinding
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.tasks.Attribute
import io.github.kakaocup.kakao.common.views.KView import io.github.kakaocup.kakao.common.views.KView
import io.github.kakaocup.kakao.screen.Screen import io.github.kakaocup.kakao.screen.Screen
import io.github.kakaocup.kakao.text.KButton import io.github.kakaocup.kakao.text.KButton
@ -15,23 +15,23 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
class StatsScreen: Screen<StatsScreen>() { class StatsScreen : Screen<StatsScreen>() {
val strengthStatsView = KView { withId(R.id.strengthStatsView)} val strengthStatsView = KView { withId(R.id.strengthStatsView) }
val strengthAllocateButton = KButton { val strengthAllocateButton = KButton {
withId(R.id.allocateButton) withId(R.id.allocateButton)
isDescendantOfA { withId(R.id.strengthStatsView) } isDescendantOfA { withId(R.id.strengthStatsView) }
} }
val intelligenceStatsView = KView { withId(R.id.intelligenceStatsView)} val intelligenceStatsView = KView { withId(R.id.intelligenceStatsView) }
val intelligenceAllocateButton = KButton { val intelligenceAllocateButton = KButton {
withId(R.id.allocateButton) withId(R.id.allocateButton)
isDescendantOfA { withId(R.id.intelligenceStatsView) } isDescendantOfA { withId(R.id.intelligenceStatsView) }
} }
val constitutionStatsView = KView { withId(R.id.constitutionStatsView)} val constitutionStatsView = KView { withId(R.id.constitutionStatsView) }
val constitutionAllocateButton = KButton { val constitutionAllocateButton = KButton {
withId(R.id.allocateButton) withId(R.id.allocateButton)
isDescendantOfA { withId(R.id.constitutionStatsView) } isDescendantOfA { withId(R.id.constitutionStatsView) }
} }
val perceptionStatsView = KView { withId(R.id.perceptionStatsView)} val perceptionStatsView = KView { withId(R.id.perceptionStatsView) }
val perceptionAllocateButton = KButton { val perceptionAllocateButton = KButton {
withId(R.id.allocateButton) withId(R.id.allocateButton)
isDescendantOfA { withId(R.id.perceptionStatsView) } isDescendantOfA { withId(R.id.perceptionStatsView) }
@ -41,8 +41,7 @@ class StatsScreen: Screen<StatsScreen>() {
@LargeTest @LargeTest
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class StatsFragmentTest: FragmentTestCase<StatsFragment, FragmentStatsBinding, StatsScreen>() { class StatsFragmentTest : FragmentTestCase<StatsFragment, FragmentStatsBinding, StatsScreen>() {
override val screen = StatsScreen() override val screen = StatsScreen()
@ -92,13 +91,13 @@ class StatsFragmentTest: FragmentTestCase<StatsFragment, FragmentStatsBinding, S
fun allocatesOnClick() { fun allocatesOnClick() {
screen { screen {
strengthAllocateButton.click() strengthAllocateButton.click()
verify { userRepository.allocatePoint(Stats.STRENGTH) } verify { userRepository.allocatePoint(Attribute.STRENGTH) }
intelligenceAllocateButton.click() intelligenceAllocateButton.click()
verify { userRepository.allocatePoint(Stats.INTELLIGENCE) } verify { userRepository.allocatePoint(Attribute.INTELLIGENCE) }
constitutionAllocateButton.click() constitutionAllocateButton.click()
verify { userRepository.allocatePoint(Stats.CONSTITUTION) } verify { userRepository.allocatePoint(Attribute.CONSTITUTION) }
perceptionAllocateButton.click() perceptionAllocateButton.click()
verify { userRepository.allocatePoint(Stats.PERCEPTION) } verify { userRepository.allocatePoint(Attribute.PERCEPTION) }
} }
} }
} }

View file

@ -1,27 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.purchases package com.habitrpg.android.habitica.ui.fragments.purchases
import androidx.fragment.app.testing.launchFragmentInContainer /*
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding
import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.models.user.Purchases
import com.habitrpg.android.habitica.models.user.SubscriptionPlan
import com.habitrpg.android.habitica.ui.fragments.FragmentTestCase
import io.github.kakaocup.kakao.common.views.KView
import io.github.kakaocup.kakao.screen.Screen
import io.github.kakaocup.kakao.text.KTextView
import io.mockk.MockKAdditionalAnswerScope
import io.mockk.coEvery
import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verify
import org.junit.Test
import org.junit.runner.RunWith
import org.solovyev.android.checkout.Sku
class GemPurchaseScreen: Screen<GemPurchaseScreen>() { class GemPurchaseScreen: Screen<GemPurchaseScreen>() {
val gems4View = KView { withId(R.id.gems_4_view) } val gems4View = KView { withId(R.id.gems_4_view) }
val gems4Button = KTextView { val gems4Button = KTextView {
@ -43,11 +22,6 @@ class GemPurchaseScreen: Screen<GemPurchaseScreen>() {
withId(R.id.purchase_button) withId(R.id.purchase_button)
isDescendantOfA { withId(R.id.gems_84_view) } isDescendantOfA { withId(R.id.gems_84_view) }
} }
val subscriptionPromo = KView { withId(R.id.subscription_promo) }
val subscriptionPromoButton = KView { withId(R.id.button)
isDescendantOfA { withId(R.id.subscription_promo) }
}
} }
@LargeTest @LargeTest
@ -166,4 +140,4 @@ class GemsPurchaseFragmentTest :
subscriptionPromo.isGone() subscriptionPromo.isGone()
} }
} }
} }*/

View file

@ -1,25 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.purchases package com.habitrpg.android.habitica.ui.fragments.purchases
import androidx.fragment.app.testing.launchFragmentInContainer /*
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding
import com.habitrpg.android.habitica.databinding.FragmentSubscriptionBinding
import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.ui.fragments.FragmentTestCase
import io.github.kakaocup.kakao.common.views.KView
import io.github.kakaocup.kakao.screen.Screen
import io.mockk.MockKAdditionalAnswerScope
import io.mockk.coEvery
import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
import org.junit.Test
import org.junit.runner.RunWith
import org.solovyev.android.checkout.Inventory
import org.solovyev.android.checkout.Sku
class SubscriptionScreen: Screen<SubscriptionScreen>() { class SubscriptionScreen: Screen<SubscriptionScreen>() {
val sub1MonthView = KView { withId(R.id.subscription1month) } val sub1MonthView = KView { withId(R.id.subscription1month) }
@ -100,4 +81,4 @@ class SubscriptionFragmentTest :
sub12MonthView.hasDescendant { withText("12 Months") } sub12MonthView.hasDescendant { withText("12 Months") }
} }
} }
} }*/

View file

@ -115,8 +115,8 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
val configuration: Configuration = resources.configuration val configuration: Configuration = resources.configuration
val languageHelper = LanguageHelper(sharedPrefs.getString("language", "en")) val languageHelper = LanguageHelper(sharedPrefs.getString("language", "en"))
if (if (SDK_INT >= Build.VERSION_CODES.N) { if (if (SDK_INT >= Build.VERSION_CODES.N) {
configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale
} else { } else {
configuration.locale != languageHelper.locale configuration.locale != languageHelper.locale
} }
) { ) {

View file

@ -1,24 +1,52 @@
package com.habitrpg.android.habitica.api package com.habitrpg.android.habitica.api
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.LeaveChallengeBody
import com.habitrpg.android.habitica.models.PurchaseValidationRequest
import com.habitrpg.android.habitica.models.PurchaseValidationResult
import com.habitrpg.android.habitica.models.SubscriptionValidationRequest
import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.auth.UserAuth import com.habitrpg.android.habitica.models.auth.UserAuth
import com.habitrpg.android.habitica.models.auth.UserAuthResponse import com.habitrpg.android.habitica.models.auth.UserAuthResponse
import com.habitrpg.android.habitica.models.auth.UserAuthSocial import com.habitrpg.android.habitica.models.auth.UserAuthSocial
import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.responses.* import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData
import com.habitrpg.android.habitica.models.responses.BuyResponse
import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.models.responses.HabitResponse
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult
import com.habitrpg.android.habitica.models.responses.SkillResponse
import com.habitrpg.android.habitica.models.responses.Status
import com.habitrpg.android.habitica.models.responses.TaskDirectionData
import com.habitrpg.android.habitica.models.responses.UnlockResponse
import com.habitrpg.android.habitica.models.responses.VerifyUsernameResponse
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.FindUsernameResult
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TaskList
import com.habitrpg.android.habitica.models.user.Items import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import retrofit2.http.* import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.HTTP
import retrofit2.http.Header
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query
@JvmSuppressWildcards @JvmSuppressWildcards
interface ApiService { interface ApiService {

View file

@ -1,4 +1,5 @@
package com.habitrpg.android.habitica.api; package com.habitrpg.android.habitica.api;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@ -43,9 +44,9 @@ import com.habitrpg.android.habitica.utils.FeedResponseDeserializer;
import com.habitrpg.android.habitica.utils.FindUsernameResultDeserializer; import com.habitrpg.android.habitica.utils.FindUsernameResultDeserializer;
import com.habitrpg.android.habitica.utils.GroupSerialization; import com.habitrpg.android.habitica.utils.GroupSerialization;
import com.habitrpg.android.habitica.utils.MemberSerialization; import com.habitrpg.android.habitica.utils.MemberSerialization;
import com.habitrpg.android.habitica.utils.NotificationDeserializer;
import com.habitrpg.android.habitica.utils.OwnedItemListDeserializer; import com.habitrpg.android.habitica.utils.OwnedItemListDeserializer;
import com.habitrpg.android.habitica.utils.OwnedMountListDeserializer; import com.habitrpg.android.habitica.utils.OwnedMountListDeserializer;
import com.habitrpg.android.habitica.utils.NotificationDeserializer;
import com.habitrpg.android.habitica.utils.OwnedPetListDeserializer; import com.habitrpg.android.habitica.utils.OwnedPetListDeserializer;
import com.habitrpg.android.habitica.utils.PurchasedDeserializer; import com.habitrpg.android.habitica.utils.PurchasedDeserializer;
import com.habitrpg.android.habitica.utils.QuestCollectDeserializer; import com.habitrpg.android.habitica.utils.QuestCollectDeserializer;

View file

@ -5,10 +5,8 @@ import com.habitrpg.android.habitica.modules.ApiModule;
import com.habitrpg.android.habitica.modules.AppModule; import com.habitrpg.android.habitica.modules.AppModule;
import com.habitrpg.android.habitica.modules.DeveloperModule; import com.habitrpg.android.habitica.modules.DeveloperModule;
import com.habitrpg.android.habitica.modules.RepositoryModule; import com.habitrpg.android.habitica.modules.RepositoryModule;
import com.habitrpg.android.habitica.modules.UserRepositoryModule;
import com.habitrpg.android.habitica.modules.UserModule; import com.habitrpg.android.habitica.modules.UserModule;
import com.habitrpg.android.habitica.modules.UserRepositoryModule;
import org.jetbrains.annotations.NotNull;
import javax.inject.Singleton; import javax.inject.Singleton;

View file

@ -76,19 +76,19 @@ import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment; import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment; import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment;
import com.habitrpg.android.habitica.ui.fragments.social.ChatFragment; import com.habitrpg.android.habitica.ui.fragments.social.ChatFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildFragment;
import com.habitrpg.android.habitica.ui.fragments.social.InboxMessageListFragment; import com.habitrpg.android.habitica.ui.fragments.social.InboxMessageListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.InboxOverviewFragment; import com.habitrpg.android.habitica.ui.fragments.social.InboxOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.NoPartyFragmentFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.QuestDetailFragment; import com.habitrpg.android.habitica.ui.fragments.social.QuestDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.TavernDetailFragment; import com.habitrpg.android.habitica.ui.fragments.social.TavernDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment; import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeDetailFragment; import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeListFragment; import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment; import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildOverviewFragment; import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.NoPartyFragmentFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment;

View file

@ -1,15 +1,37 @@
package com.habitrpg.android.habitica.data package com.habitrpg.android.habitica.data
import com.habitrpg.android.habitica.api.HostConfig import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.LeaveChallengeBody
import com.habitrpg.android.habitica.models.PurchaseValidationRequest
import com.habitrpg.android.habitica.models.PurchaseValidationResult
import com.habitrpg.android.habitica.models.SubscriptionValidationRequest
import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.auth.UserAuthResponse import com.habitrpg.android.habitica.models.auth.UserAuthResponse
import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.responses.* import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData
import com.habitrpg.android.habitica.models.responses.BuyResponse
import com.habitrpg.android.habitica.models.responses.ErrorResponse
import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.models.responses.HabitResponse
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult
import com.habitrpg.android.habitica.models.responses.SkillResponse
import com.habitrpg.android.habitica.models.responses.Status
import com.habitrpg.android.habitica.models.responses.TaskDirectionData
import com.habitrpg.android.habitica.models.responses.UnlockResponse
import com.habitrpg.android.habitica.models.responses.VerifyUsernameResponse
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.FindUsernameResult
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TaskList
import com.habitrpg.android.habitica.models.user.Items import com.habitrpg.android.habitica.models.user.Items

View file

@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.WorldState import com.habitrpg.android.habitica.models.WorldState
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
interface ContentRepository: BaseRepository { interface ContentRepository : BaseRepository {
fun retrieveContent(forced: Boolean = false): Flowable<ContentResult> fun retrieveContent(forced: Boolean = false): Flowable<ContentResult>
fun retrieveWorldState(): Flowable<WorldState> fun retrieveWorldState(): Flowable<WorldState>

View file

@ -1,11 +1,23 @@
package com.habitrpg.android.habitica.data package com.habitrpg.android.habitica.data
import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.responses.BuyResponse import com.habitrpg.android.habitica.models.responses.BuyResponse
import com.habitrpg.android.habitica.models.responses.FeedResponse import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.* import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
interface InventoryRepository : BaseRepository { interface InventoryRepository : BaseRepository {

View file

@ -4,11 +4,14 @@ import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult import com.habitrpg.android.habitica.models.responses.PostChatMessageResult
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.FindUsernameResult
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.GroupMembership
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import java.util.*
interface SocialRepository : BaseRepository { interface SocialRepository : BaseRepository {
fun getPublicGuilds(): Flowable<out List<Group>> fun getPublicGuilds(): Flowable<out List<Group>>

View file

@ -11,7 +11,7 @@ import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import java.util.* import java.util.Date
interface TaskRepository : BaseRepository { interface TaskRepository : BaseRepository {
fun getTasks(taskType: TaskType, userID: String? = null): Flowable<out List<Task>> fun getTasks(taskType: TaskType, userID: String? = null): Flowable<out List<Task>>

View file

@ -13,7 +13,15 @@ import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.api.Server import com.habitrpg.android.habitica.api.Server
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.helpers.NotificationsManager import com.habitrpg.android.habitica.helpers.NotificationsManager
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.LeaveChallengeBody
import com.habitrpg.android.habitica.models.PurchaseValidationRequest
import com.habitrpg.android.habitica.models.PurchaseValidationResult
import com.habitrpg.android.habitica.models.SubscriptionValidationRequest
import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.auth.UserAuth import com.habitrpg.android.habitica.models.auth.UserAuth
import com.habitrpg.android.habitica.models.auth.UserAuthResponse import com.habitrpg.android.habitica.models.auth.UserAuthResponse
import com.habitrpg.android.habitica.models.auth.UserAuthSocial import com.habitrpg.android.habitica.models.auth.UserAuthSocial
@ -21,10 +29,24 @@ import com.habitrpg.android.habitica.models.auth.UserAuthSocialTokens
import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.responses.* import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData
import com.habitrpg.android.habitica.models.responses.BuyResponse
import com.habitrpg.android.habitica.models.responses.ErrorResponse
import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.models.responses.HabitResponse
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult
import com.habitrpg.android.habitica.models.responses.SkillResponse
import com.habitrpg.android.habitica.models.responses.Status
import com.habitrpg.android.habitica.models.responses.TaskDirectionData
import com.habitrpg.android.habitica.models.responses.UnlockResponse
import com.habitrpg.android.habitica.models.responses.VerifyUsernameResponse
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.Challenge
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.FindUsernameResult
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskList import com.habitrpg.android.habitica.models.tasks.TaskList
import com.habitrpg.android.habitica.models.user.Items import com.habitrpg.android.habitica.models.user.Items
@ -48,7 +70,7 @@ import java.io.IOException
import java.net.SocketException import java.net.SocketException
import java.net.SocketTimeoutException import java.net.SocketTimeoutException
import java.net.UnknownHostException import java.net.UnknownHostException
import java.util.* import java.util.GregorianCalendar
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.net.ssl.SSLException import javax.net.ssl.SSLException

View file

@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.WorldState import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.inventory.SpecialItem import com.habitrpg.android.habitica.models.inventory.SpecialItem
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import java.util.* import java.util.Date
class ContentRepositoryImpl<T : ContentLocalRepository>(localRepository: T, apiClient: ApiClient, context: Context) : BaseRepositoryImpl<T>(localRepository, apiClient), ContentRepository { class ContentRepositoryImpl<T : ContentLocalRepository>(localRepository: T, apiClient: ApiClient, context: Context) : BaseRepositoryImpl<T>(localRepository, apiClient), ContentRepository {

View file

@ -4,12 +4,24 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.responses.BuyResponse import com.habitrpg.android.habitica.models.responses.BuyResponse
import com.habitrpg.android.habitica.models.responses.FeedResponse import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.* import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClient: ApiClient, userID: String, var appConfigManager: AppConfigManager) : BaseRepositoryImpl<InventoryLocalRepository>(localRepository, apiClient, userID), InventoryRepository { class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClient: ApiClient, userID: String, var appConfigManager: AppConfigManager) : BaseRepositoryImpl<InventoryLocalRepository>(localRepository, apiClient, userID), InventoryRepository {

View file

@ -9,13 +9,16 @@ import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.responses.PostChatMessageResult import com.habitrpg.android.habitica.models.responses.PostChatMessageResult
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.FindUsernameResult
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.GroupMembership
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import retrofit2.HttpException import retrofit2.HttpException
import java.util.* import java.util.UUID
import kotlin.collections.HashMap
class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl<SocialLocalRepository>(localRepository, apiClient, userID), SocialRepository { class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl<SocialLocalRepository>(localRepository, apiClient, userID), SocialRepository {
override fun transferGroupOwnership(groupID: String, userID: String): Flowable<Group> { override fun transferGroupOwnership(groupID: String, userID: String): Flowable<Group> {

View file

@ -12,7 +12,11 @@ import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData
import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.responses.TaskDirectionData import com.habitrpg.android.habitica.models.responses.TaskDirectionData
import com.habitrpg.android.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.models.responses.TaskScoringResult
import com.habitrpg.android.habitica.models.tasks.* import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskList
import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.tasks.TasksOrder
import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.proxy.AnalyticsManager import com.habitrpg.android.habitica.proxy.AnalyticsManager
@ -20,7 +24,9 @@ import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import java.util.Locale
import java.util.UUID
class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiClient, userID: String, val appConfigManager: AppConfigManager, val analyticsManager: AnalyticsManager) : BaseRepositoryImpl<TaskLocalRepository>(localRepository, apiClient, userID), TaskRepository { class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiClient, userID: String, val appConfigManager: AppConfigManager, val analyticsManager: AnalyticsManager) : BaseRepositoryImpl<TaskLocalRepository>(localRepository, apiClient, userID), TaskRepository {
private var lastTaskAction: Long = 0 private var lastTaskAction: Long = 0

View file

@ -26,7 +26,8 @@ import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.functions.BiFunction import io.reactivex.rxjava3.functions.BiFunction
import java.util.* import java.util.Date
import java.util.GregorianCalendar
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiClient, userID: String, private val taskRepository: TaskRepository, var appConfigManager: AppConfigManager) : BaseRepositoryImpl<UserLocalRepository>(localRepository, apiClient, userID), UserRepository { class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiClient, userID: String, private val taskRepository: TaskRepository, var appConfigManager: AppConfigManager) : BaseRepositoryImpl<UserLocalRepository>(localRepository, apiClient, userID), UserRepository {
@ -380,7 +381,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli
override fun retrieveTeamPlan(teamID: String): Flowable<Group> { override fun retrieveTeamPlan(teamID: String): Flowable<Group> {
return Flowable.zip( return Flowable.zip(
apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID)) { team, tasks -> apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID)
) { team, tasks ->
team.tasks = tasks team.tasks = tasks
team team
} }

View file

@ -1,8 +1,16 @@
package com.habitrpg.android.habitica.data.local package com.habitrpg.android.habitica.data.local
import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.* import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
interface InventoryLocalRepository : ContentLocalRepository { interface InventoryLocalRepository : ContentLocalRepository {

View file

@ -1,6 +1,10 @@
package com.habitrpg.android.habitica.data.local package com.habitrpg.android.habitica.data.local
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.QuestAchievement
import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.TutorialStep
import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User

View file

@ -9,7 +9,6 @@ import hu.akarnokd.rxjava3.bridge.RxJavaBridge
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.realm.Realm import io.realm.Realm
import io.realm.Sort import io.realm.Sort
import java.util.*
class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), ChallengeLocalRepository { class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), ChallengeLocalRepository {

View file

@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.models.inventory.Customization
import hu.akarnokd.rxjava3.bridge.RxJavaBridge import hu.akarnokd.rxjava3.bridge.RxJavaBridge
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.realm.Realm import io.realm.Realm
import java.util.* import java.util.Date
class RealmCustomizationLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), CustomizationLocalRepository { class RealmCustomizationLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), CustomizationLocalRepository {

View file

@ -2,18 +2,29 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.inventory.Item
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.inventory.SpecialItem
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.* import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import hu.akarnokd.rxjava3.bridge.RxJavaBridge import hu.akarnokd.rxjava3.bridge.RxJavaBridge
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.Sort import io.realm.Sort
import io.realm.kotlin.isManaged
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import kotlin.collections.HashMap import java.util.Locale
class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), InventoryLocalRepository { class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), InventoryLocalRepository {
override fun getQuestContent(keys: List<String>): Flowable<out List<QuestContent>> { override fun getQuestContent(keys: List<String>): Flowable<out List<QuestContent>> {

View file

@ -3,13 +3,16 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.SocialLocalRepository import com.habitrpg.android.habitica.data.local.SocialLocalRepository
import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.social.* import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.ChatMessageLike
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.GroupMembership
import com.habitrpg.android.habitica.models.social.InboxConversation
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import hu.akarnokd.rxjava3.bridge.RxJavaBridge import hu.akarnokd.rxjava3.bridge.RxJavaBridge
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import io.realm.Realm import io.realm.Realm
import io.realm.Sort import io.realm.Sort
import java.util.*
class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), SocialLocalRepository { class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), SocialLocalRepository {
@ -58,9 +61,9 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm)
messages.forEach { it.userID = userID } messages.forEach { it.userID = userID }
for (message in messages) { for (message in messages) {
val existingMessage = realm.where(ChatMessage::class.java) val existingMessage = realm.where(ChatMessage::class.java)
.equalTo("id", message.id) .equalTo("id", message.id)
.findAll() .findAll()
.firstOrNull() .firstOrNull()
message.isSeen = existingMessage != null message.isSeen = existingMessage != null
} }
save(messages) save(messages)

View file

@ -1,7 +1,12 @@
package com.habitrpg.android.habitica.data.local.implementation package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.TaskLocalRepository import com.habitrpg.android.habitica.data.local.TaskLocalRepository
import com.habitrpg.android.habitica.models.tasks.* import com.habitrpg.android.habitica.models.tasks.ChecklistItem
import com.habitrpg.android.habitica.models.tasks.RemindersItem
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskList
import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.tasks.TasksOrder
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import hu.akarnokd.rxjava3.bridge.RxJavaBridge import hu.akarnokd.rxjava3.bridge.RxJavaBridge
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable

View file

@ -2,7 +2,12 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.UserLocalRepository import com.habitrpg.android.habitica.data.local.UserLocalRepository
import com.habitrpg.android.habitica.data.local.UserQuestStatus import com.habitrpg.android.habitica.data.local.UserQuestStatus
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.QuestAchievement
import com.habitrpg.android.habitica.models.Skill
import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.TeamPlan
import com.habitrpg.android.habitica.models.TutorialStep
import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User

View file

@ -3,8 +3,8 @@ package com.habitrpg.android.habitica.executors;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import io.reactivex.rxjava3.core.Scheduler;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Scheduler;
@Singleton @Singleton
public class UIThread implements PostExecutionThread { public class UIThread implements PostExecutionThread {

View file

@ -5,7 +5,7 @@ import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import java.util.* import java.util.Locale
val Context.layoutInflater: LayoutInflater val Context.layoutInflater: LayoutInflater
get() = this.getSystemService(Service.LAYOUT_INFLATER_SERVICE) as LayoutInflater get() = this.getSystemService(Service.LAYOUT_INFLATER_SERVICE) as LayoutInflater

View file

@ -2,9 +2,13 @@ package com.habitrpg.android.habitica.extensions
import android.content.res.Resources import android.content.res.Resources
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import java.util.* import java.util.Calendar
import java.util.Date
import kotlin.math.round import kotlin.math.round
import kotlin.time.* import kotlin.time.Duration
import kotlin.time.DurationUnit
import kotlin.time.ExperimentalTime
import kotlin.time.milliseconds
class DateUtils { class DateUtils {

View file

@ -1,7 +1,6 @@
package com.habitrpg.android.habitica.extensions package com.habitrpg.android.habitica.extensions
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context
import android.os.Build import android.os.Build
fun withImmutableFlag(flags: Int): Int { fun withImmutableFlag(flags: Int): Int {
@ -18,4 +17,4 @@ fun withMutableFlag(flags: Int): Int {
} else { } else {
flags flags
} }
} }

View file

@ -4,7 +4,6 @@ import com.amplitude.api.Amplitude
import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.BuildConfig
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
import java.util.HashMap
object AmplitudeManager { object AmplitudeManager {
var EVENT_CATEGORY_BEHAVIOUR = "behaviour" var EVENT_CATEGORY_BEHAVIOUR = "behaviour"

View file

@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion
import com.habitrpg.android.habitica.models.promotions.HabiticaWebPromotion import com.habitrpg.android.habitica.models.promotions.HabiticaWebPromotion
import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey
import java.util.*
class AppConfigManager(contentRepository: ContentRepository?) { class AppConfigManager(contentRepository: ContentRepository?) {

View file

@ -1,6 +1,6 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import java.util.* import java.util.Date
class AprilFoolsHandler { class AprilFoolsHandler {

View file

@ -19,7 +19,7 @@ import java.io.IOException
import java.io.InputStreamReader import java.io.InputStreamReader
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.util.* import java.util.Locale
/* /*
* Copyright (C) 2017 Jared Rummler * Copyright (C) 2017 Jared Rummler
@ -434,9 +434,9 @@ object DeviceName {
val info = DeviceInfo(json) val info = DeviceInfo(json)
if (codename.equals(info.codename, ignoreCase = true) && model == null || if (codename.equals(info.codename, ignoreCase = true) && model == null ||
codename.equals( codename.equals(
info.codename, info.codename,
ignoreCase = true ignoreCase = true
) && model.equals(info.model, ignoreCase = true) ) && model.equals(info.model, ignoreCase = true)
) { ) {
// Save to SharedPreferences so we don't need to make another request. // Save to SharedPreferences so we don't need to make another request.
val editor = prefs.edit() val editor = prefs.edit()

View file

@ -2,7 +2,7 @@ package com.habitrpg.android.habitica.helpers
import android.os.Build import android.os.Build
import java.text.NumberFormat import java.text.NumberFormat
import java.util.* import java.util.Locale
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.floor import kotlin.math.floor

View file

@ -13,11 +13,26 @@ import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.IOException import java.io.IOException
import java.io.UnsupportedEncodingException import java.io.UnsupportedEncodingException
import java.lang.IllegalStateException
import java.math.BigInteger import java.math.BigInteger
import java.security.* import java.security.GeneralSecurityException
import java.util.* import java.security.InvalidAlgorithmParameterException
import javax.crypto.* import java.security.Key
import java.security.KeyPairGenerator
import java.security.KeyStore
import java.security.KeyStoreException
import java.security.NoSuchAlgorithmException
import java.security.NoSuchProviderException
import java.security.SecureRandom
import java.security.UnrecoverableKeyException
import java.util.Calendar
import javax.crypto.BadPaddingException
import javax.crypto.Cipher
import javax.crypto.CipherInputStream
import javax.crypto.CipherOutputStream
import javax.crypto.IllegalBlockSizeException
import javax.crypto.KeyGenerator
import javax.crypto.NoSuchPaddingException
import javax.crypto.SecretKey
import javax.crypto.spec.GCMParameterSpec import javax.crypto.spec.GCMParameterSpec
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
import javax.security.auth.x500.X500Principal import javax.security.auth.x500.X500Principal

View file

@ -1,6 +1,6 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import java.util.* import java.util.Locale
class LanguageHelper(languageSharedPref: String?) { class LanguageHelper(languageSharedPref: String?) {

View file

@ -8,7 +8,7 @@ import androidx.navigation.NavController
import androidx.navigation.NavDeepLinkRequest import androidx.navigation.NavDeepLinkRequest
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.Date
import kotlin.math.abs import kotlin.math.abs
object MainNavigationController { object MainNavigationController {

View file

@ -7,7 +7,7 @@ import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.BehaviorSubject
import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.PublishSubject
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.Date
class NotificationsManager { class NotificationsManager {
private val displayNotificationSubject = PublishSubject.create<Notification>() private val displayNotificationSubject = PublishSubject.create<Notification>()
@ -19,9 +19,9 @@ class NotificationsManager {
private var lastNotificationHandling: Date? = null private var lastNotificationHandling: Date? = null
val displayNotificationEvents: Flowable<Notification> val displayNotificationEvents: Flowable<Notification>
get() { get() {
return displayNotificationSubject.toFlowable(BackpressureStrategy.DROP) return displayNotificationSubject.toFlowable(BackpressureStrategy.DROP)
} }
init { init {
this.seenNotifications = HashMap() this.seenNotifications = HashMap()

View file

@ -1,21 +1,27 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import android.app.Activity import android.app.Activity
import android.app.Application
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import com.android.billingclient.api.* import com.android.billingclient.api.AcknowledgePurchaseParams
import com.android.billingclient.api.BillingClient.ConnectionState.DISCONNECTED import com.android.billingclient.api.BillingClient
import com.google.api.Billing import com.android.billingclient.api.BillingClientStateListener
import com.google.firebase.analytics.FirebaseAnalytics import com.android.billingclient.api.BillingFlowParams
import com.android.billingclient.api.BillingResult
import com.android.billingclient.api.ConsumeParams
import com.android.billingclient.api.Purchase
import com.android.billingclient.api.PurchasesResponseListener
import com.android.billingclient.api.PurchasesUpdatedListener
import com.android.billingclient.api.SkuDetails
import com.android.billingclient.api.SkuDetailsParams
import com.android.billingclient.api.queryPurchasesAsync
import com.android.billingclient.api.querySkuDetails
import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.models.IAPGift import com.habitrpg.android.habitica.models.IAPGift
@ -28,12 +34,14 @@ import com.habitrpg.android.habitica.ui.activities.PurchaseActivity
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import kotlinx.coroutines.* import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject import org.json.JSONObject
import retrofit2.HttpException import retrofit2.HttpException
import java.util.Date
import java.util.*
open class PurchaseHandler( open class PurchaseHandler(
private val context: Context, private val context: Context,
@ -72,7 +80,6 @@ open class PurchaseHandler(
} }
} }
init { init {
startListening() startListening()
} }
@ -86,9 +93,9 @@ open class PurchaseHandler(
DISCONNECTED; DISCONNECTED;
val canMaybePurchase: Boolean val canMaybePurchase: Boolean
get() { get() {
return this == UNITITIALIZED || this == READY return this == UNITITIALIZED || this == READY
} }
} }
fun startListening() { fun startListening() {
@ -169,7 +176,6 @@ open class PurchaseHandler(
.setPurchaseToken(purchase.purchaseToken) .setPurchaseToken(purchase.purchaseToken)
.build() .build()
billingClient.consumeAsync(params) { result, message -> billingClient.consumeAsync(params) { result, message ->
} }
} }
@ -209,7 +215,8 @@ open class PurchaseHandler(
val plan = userViewModel.user.value?.purchased?.plan val plan = userViewModel.user.value?.purchased?.plan
if (plan?.isActive == true) { if (plan?.isActive == true) {
if (plan.additionalData?.data?.orderId == purchase.orderId && if (plan.additionalData?.data?.orderId == purchase.orderId &&
(plan.dateTerminated != null == purchase.isAutoRenewing)) { (plan.dateTerminated != null == purchase.isAutoRenewing)
) {
return return
} }
} }
@ -291,7 +298,6 @@ open class PurchaseHandler(
.flatMap { userViewModel.userRepository.retrieveUser(false, true) } .flatMap { userViewModel.userRepository.retrieveUser(false, true) }
} }
private fun durationString(sku: String): String { private fun durationString(sku: String): String {
return when (sku) { return when (sku) {
PurchaseTypes.Subscription1MonthNoRenew, PurchaseTypes.Subscription1Month -> "1" PurchaseTypes.Subscription1MonthNoRenew, PurchaseTypes.Subscription1Month -> "1"
@ -383,7 +389,7 @@ open class PurchaseHandler(
suspend fun retryUntil( suspend fun retryUntil(
times: Int = Int.MAX_VALUE, times: Int = Int.MAX_VALUE,
initialDelay: Long = 100, // 0.1 second initialDelay: Long = 100, // 0.1 second
maxDelay: Long = 1000, // 1 second maxDelay: Long = 1000, // 1 second
factor: Double = 2.0, factor: Double = 2.0,
block: suspend () -> Boolean block: suspend () -> Boolean
) { ) {
@ -393,4 +399,4 @@ suspend fun retryUntil(
delay(currentDelay) delay(currentDelay)
currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay)
} }
} }

View file

@ -5,7 +5,7 @@ import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration
import java.util.* import java.util.UUID
class SignInWithAppleService( class SignInWithAppleService(
private val fragmentManager: FragmentManager, private val fragmentManager: FragmentManager,

View file

@ -17,7 +17,8 @@ import com.habitrpg.android.habitica.receivers.TaskReceiver
import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.HLogger
import com.habitrpg.shared.habitica.LogLevel import com.habitrpg.shared.habitica.LogLevel
import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Flowable
import java.util.* import java.util.Calendar
import java.util.Date
class TaskAlarmManager(private var context: Context, private var taskRepository: TaskRepository, private var userId: String) { class TaskAlarmManager(private var context: Context, private var taskRepository: TaskRepository, private var userId: String) {
private val am: AlarmManager? = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager private val am: AlarmManager? = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager

View file

@ -6,7 +6,6 @@ import io.realm.Case
import io.realm.OrderedRealmCollection import io.realm.OrderedRealmCollection
import io.realm.RealmQuery import io.realm.RealmQuery
import io.realm.Sort import io.realm.Sort
import java.util.*
class TaskFilterHelper { class TaskFilterHelper {
var searchQuery: String? = null var searchQuery: String? = null

View file

@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.Avatar
import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import java.util.*
class UserStatComputer { class UserStatComputer {

View file

@ -11,12 +11,12 @@ import androidx.core.app.Person
import androidx.core.app.RemoteInput import androidx.core.app.RemoteInput
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.withImmutableFlag
import com.habitrpg.android.habitica.extensions.withMutableFlag import com.habitrpg.android.habitica.extensions.withMutableFlag
import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver
import com.habitrpg.android.habitica.ui.helpers.EmojiParser import com.habitrpg.android.habitica.ui.helpers.EmojiParser
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import java.util.Locale
class GroupActivityNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) { class GroupActivityNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) {

View file

@ -10,7 +10,7 @@ import androidx.core.app.NotificationManagerCompat
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.withImmutableFlag import com.habitrpg.android.habitica.extensions.withImmutableFlag
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
import java.util.* import java.util.Date
/** /**
* Created by keithholliday on 6/28/16. * Created by keithholliday on 6/28/16.

View file

@ -9,7 +9,6 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import java.util.*
class PushNotificationManager(var apiClient: ApiClient, private val sharedPreferences: SharedPreferences, private val context: Context) { class PushNotificationManager(var apiClient: ApiClient, private val sharedPreferences: SharedPreferences, private val context: Context) {

View file

@ -80,4 +80,4 @@ constructor(
class RequestValues(val pet: Pet, val food: Food, val context: BaseActivity) : class RequestValues(val pet: Pet, val food: Food, val context: BaseActivity) :
UseCase.RequestValues UseCase.RequestValues
} }

View file

@ -51,4 +51,4 @@ constructor(private val inventoryRepository: InventoryRepository, postExecutionT
} }
class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: BaseActivity) : UseCase.RequestValues class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: BaseActivity) : UseCase.RequestValues
} }

View file

@ -9,7 +9,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.util.Pair import androidx.core.util.Pair
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R

View file

@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskType import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import java.util.*
import kotlin.math.min import kotlin.math.min
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToLong import kotlin.math.roundToLong

View file

@ -1,6 +1,14 @@
package com.habitrpg.android.habitica.models package com.habitrpg.android.habitica.models
import com.habitrpg.android.habitica.models.inventory.* import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.inventory.SpecialItem
import io.realm.RealmList import io.realm.RealmList
/** /**

View file

@ -1,6 +1,19 @@
package com.habitrpg.android.habitica.models package com.habitrpg.android.habitica.models
import com.habitrpg.android.habitica.models.notifications.* import com.habitrpg.android.habitica.models.notifications.AchievementData
import com.habitrpg.android.habitica.models.notifications.ChallengeWonData
import com.habitrpg.android.habitica.models.notifications.FirstDropData
import com.habitrpg.android.habitica.models.notifications.GroupTaskApprovedData
import com.habitrpg.android.habitica.models.notifications.GroupTaskNeedsWorkData
import com.habitrpg.android.habitica.models.notifications.GroupTaskRequiresApprovalData
import com.habitrpg.android.habitica.models.notifications.GuildInvitationData
import com.habitrpg.android.habitica.models.notifications.LoginIncentiveData
import com.habitrpg.android.habitica.models.notifications.NewChatMessageData
import com.habitrpg.android.habitica.models.notifications.NewStuffData
import com.habitrpg.android.habitica.models.notifications.NotificationData
import com.habitrpg.android.habitica.models.notifications.PartyInvitationData
import com.habitrpg.android.habitica.models.notifications.QuestInvitationData
import com.habitrpg.android.habitica.models.notifications.UnallocatedPointsData
class Notification { class Notification {
enum class Type(val type: String) { enum class Type(val type: String) {

View file

@ -1,7 +1,5 @@
package com.habitrpg.android.habitica.models package com.habitrpg.android.habitica.models
import com.habitrpg.android.habitica.models.tasks.Task
import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey

View file

@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class TutorialStep : RealmObject(), BaseMainObject { open class TutorialStep : RealmObject(), BaseMainObject {

View file

@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.inventory.QuestRageStrike
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.*
open class WorldState : RealmObject(), BaseObject { open class WorldState : RealmObject(), BaseObject {
@PrimaryKey @PrimaryKey

View file

@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class WorldStateEvent : RealmObject(), BaseMainObject { open class WorldStateEvent : RealmObject(), BaseMainObject {

View file

@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models.inventory
import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.* import java.util.Date
open class Customization : RealmObject(), BaseObject { open class Customization : RealmObject(), BaseObject {
@PrimaryKey @PrimaryKey

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.*
open class Egg : RealmObject(), Item { open class Egg : RealmObject(), Item {
@PrimaryKey @PrimaryKey

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.BaseMainObject
import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.*
open class Food : RealmObject(), Item { open class Food : RealmObject(), Item {
@PrimaryKey @PrimaryKey

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.*
open class HatchingPotion : RealmObject(), Item { open class HatchingPotion : RealmObject(), Item {
@PrimaryKey @PrimaryKey

View file

@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models.inventory
import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import java.util.* import java.util.Date
open class ItemEvent : RealmObject(), BaseObject { open class ItemEvent : RealmObject(), BaseObject {
var start: Date? = null var start: Date? = null

View file

@ -3,9 +3,15 @@ package com.habitrpg.android.habitica.models.members
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.Avatar
import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.BaseMainObject
import com.habitrpg.android.habitica.models.BaseObject
import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.social.UserParty
import com.habitrpg.android.habitica.models.user.* import com.habitrpg.android.habitica.models.user.Authentication
import com.habitrpg.android.habitica.models.user.Backer
import com.habitrpg.android.habitica.models.user.ContributorInfo
import com.habitrpg.android.habitica.models.user.Inbox
import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.models.user.Outfit
import com.habitrpg.android.habitica.models.user.Profile
import com.habitrpg.android.habitica.models.user.Stats
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.promotions
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.ShapeDrawable import android.graphics.drawable.ShapeDrawable
import android.view.View import android.view.View
@ -14,10 +13,10 @@ import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
import com.habitrpg.android.habitica.extensions.DateUtils import com.habitrpg.android.habitica.extensions.DateUtils
import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import java.util.Locale
class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() { class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
override val identifier: String override val identifier: String

View file

@ -16,7 +16,8 @@ import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import java.util.Locale
class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() { class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
override val identifier: String override val identifier: String

View file

@ -7,7 +7,7 @@ import com.habitrpg.android.habitica.databinding.FragmentSubscriptionBinding
import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
import java.util.* import java.util.Date
enum class PromoType { enum class PromoType {
GEMS_AMOUNT, GEMS_AMOUNT,
@ -18,10 +18,10 @@ enum class PromoType {
abstract class HabiticaPromotion { abstract class HabiticaPromotion {
val isActive: Boolean val isActive: Boolean
get() { get() {
val now = Date() val now = Date()
return startDate.before(now) && endDate.after(now) return startDate.before(now) && endDate.after(now)
} }
abstract val identifier: String abstract val identifier: String
abstract val promoType: PromoType abstract val promoType: PromoType

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.promotions
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.ShapeDrawable import android.graphics.drawable.ShapeDrawable
import android.view.View import android.view.View
@ -14,10 +13,10 @@ import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
import com.habitrpg.android.habitica.extensions.DateUtils import com.habitrpg.android.habitica.extensions.DateUtils
import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import java.util.Locale
class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() { class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
override val identifier: String override val identifier: String

View file

@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.fragments.PromoWebFragmentArgs import com.habitrpg.android.habitica.ui.fragments.PromoWebFragmentArgs
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
import java.util.* import java.util.Date
class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion { class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion {
override val identifier: String override val identifier: String

View file

@ -1,14 +1,13 @@
package com.habitrpg.android.habitica.models.social package com.habitrpg.android.habitica.models.social
import com.habitrpg.android.habitica.models.BaseMainObject import com.habitrpg.android.habitica.models.BaseMainObject
import com.habitrpg.android.habitica.models.BaseObject
import com.habitrpg.android.habitica.models.tasks.TasksOrder import com.habitrpg.android.habitica.models.tasks.TasksOrder
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.* import java.util.Date
open class Challenge : RealmObject(), BaseMainObject { open class Challenge : RealmObject(), BaseMainObject {

View file

@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.BaseObject
import com.habitrpg.android.habitica.models.user.ContributorInfo import com.habitrpg.android.habitica.models.user.ContributorInfo
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.* import java.util.Date
open class InboxConversation : RealmObject(), BaseObject { open class InboxConversation : RealmObject(), BaseObject {

View file

@ -9,4 +9,4 @@ enum class Attribute constructor(val value: String) {
companion object { companion object {
fun from(type: String?): Attribute? = values().find { it.value == type } fun from(type: String?): Attribute? = values().find { it.value == type }
} }
} }

View file

@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.models.BaseMainObject
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.* import java.util.UUID
open class ChecklistItem : RealmObject, BaseMainObject, Parcelable { open class ChecklistItem : RealmObject, BaseMainObject, Parcelable {

View file

@ -9,4 +9,4 @@ enum class Frequency constructor(val value: String) {
companion object { companion object {
fun from(type: String?): Frequency? = values().find { it.value == type } fun from(type: String?): Frequency? = values().find { it.value == type }
} }
} }

View file

@ -15,7 +15,6 @@ import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONException import org.json.JSONException
import java.util.ArrayList
import java.util.Calendar import java.util.Calendar
import java.util.Date import java.util.Date
import java.util.GregorianCalendar import java.util.GregorianCalendar
@ -285,13 +284,10 @@ open class Task : RealmObject, BaseMainObject, Parcelable {
streak != task.streak -> true streak != task.streak -> true
else -> false else -> false
} }
} else if (type == TaskType.TODO) { } else if (type == TaskType.TODO) {
return dueDate != task.dueDate return dueDate != task.dueDate
} else if (type == TaskType.REWARD) { } else if (type == TaskType.REWARD) {
return value != task.value return value != task.value
} else { } else {
return false return false
} }

View file

@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class TaskGroupPlan : RealmObject(), BaseObject { open class TaskGroupPlan : RealmObject(), BaseObject {

View file

@ -12,4 +12,4 @@ enum class TaskType constructor(val value: String) {
companion object { companion object {
fun from(type: String?): TaskType? = values().find { it.value == type } fun from(type: String?): TaskType? = values().find { it.value == type }
} }
} }

View file

@ -4,6 +4,6 @@ import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class AdditionalSubscriptionInfo: RealmObject() { open class AdditionalSubscriptionInfo : RealmObject() {
var data: GoogleSubscriptionData? = null var data: GoogleSubscriptionData? = null
} }

View file

@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class AuthenticationTimestamps : RealmObject(), BaseObject { open class AuthenticationTimestamps : RealmObject(), BaseObject {

View file

@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class Items : RealmObject, BaseObject { open class Items : RealmObject, BaseObject {
@ -64,10 +64,10 @@ open class Items : RealmObject, BaseObject {
val hasTransformationItems: Boolean val hasTransformationItems: Boolean
get() { get() {
return special?.any { transformationItem -> return special?.any { transformationItem ->
transformationItem.key == ("seafoam") && transformationItem.numberOwned > 0|| transformationItem.key == ("seafoam") && transformationItem.numberOwned > 0 ||
transformationItem.key == ("shinySeed") && transformationItem.numberOwned > 0|| transformationItem.key == ("shinySeed") && transformationItem.numberOwned > 0 ||
transformationItem.key == ("snowball") && transformationItem.numberOwned > 0|| transformationItem.key == ("snowball") && transformationItem.numberOwned > 0 ||
transformationItem.key == ("spookySparkles") && transformationItem.numberOwned > 0 transformationItem.key == ("spookySparkles") && transformationItem.numberOwned > 0
} ?: false } ?: false
} }
} }

View file

@ -5,7 +5,6 @@ import com.habitrpg.android.habitica.models.AvatarPreferences
import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.*
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class Preferences : RealmObject(), AvatarPreferences, BaseObject { open class Preferences : RealmObject(), AvatarPreferences, BaseObject {

View file

@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.BaseObject
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.RealmClass import io.realm.annotations.RealmClass
import java.util.* import java.util.Date
@RealmClass(embedded = true) @RealmClass(embedded = true)
open class SubscriptionPlan : RealmObject(), BaseObject { open class SubscriptionPlan : RealmObject(), BaseObject {

View file

@ -2,7 +2,12 @@ package com.habitrpg.android.habitica.models.user
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.models.* import com.habitrpg.android.habitica.models.Avatar
import com.habitrpg.android.habitica.models.BaseMainObject
import com.habitrpg.android.habitica.models.PushDevice
import com.habitrpg.android.habitica.models.QuestAchievement
import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.VersionedObject
import com.habitrpg.android.habitica.models.invitations.Invitations import com.habitrpg.android.habitica.models.invitations.Invitations
import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.models.social.ChallengeMembership
import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.social.UserParty
@ -12,7 +17,7 @@ import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import java.util.* import java.util.Date
open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject { open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject {

View file

@ -1,20 +1,20 @@
package com.habitrpg.android.habitica.modules package com.habitrpg.android.habitica.modules
import android.content.Context import android.content.Context
import com.habitrpg.android.habitica.data.implementation.ApiClientImpl.Companion.createGsonFactory
import android.content.SharedPreferences import android.content.SharedPreferences
import com.habitrpg.android.habitica.helpers.KeyHelper
import com.habitrpg.android.habitica.api.HostConfig import com.habitrpg.android.habitica.api.HostConfig
import retrofit2.converter.gson.GsonConverterFactory import com.habitrpg.android.habitica.api.MaintenanceApiService
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.implementation.ApiClientImpl import com.habitrpg.android.habitica.data.implementation.ApiClientImpl
import com.habitrpg.android.habitica.data.implementation.ApiClientImpl.Companion.createGsonFactory
import com.habitrpg.android.habitica.helpers.KeyHelper
import com.habitrpg.android.habitica.helpers.NotificationsManager import com.habitrpg.android.habitica.helpers.NotificationsManager
import com.habitrpg.android.habitica.proxy.AnalyticsManager import com.habitrpg.android.habitica.proxy.AnalyticsManager
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.api.MaintenanceApiService
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import javax.inject.Singleton import javax.inject.Singleton

View file

@ -7,13 +7,15 @@ import android.content.res.Resources
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.executors.PostExecutionThread import com.habitrpg.android.habitica.executors.PostExecutionThread
import com.habitrpg.android.habitica.executors.UIThread import com.habitrpg.android.habitica.executors.UIThread
import com.habitrpg.android.habitica.helpers.* import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.KeyHelper
import com.habitrpg.android.habitica.helpers.KeyHelper.Companion.getInstance import com.habitrpg.android.habitica.helpers.KeyHelper.Companion.getInstance
import com.habitrpg.android.habitica.helpers.SoundFileLoader
import com.habitrpg.android.habitica.helpers.SoundManager
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager
import com.habitrpg.android.habitica.proxy.AnalyticsManager
import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.HLogger
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides

View file

@ -1,11 +1,11 @@
package com.habitrpg.android.habitica.modules package com.habitrpg.android.habitica.modules
import android.content.Context import android.content.Context
import com.habitrpg.android.habitica.data.local.ContentLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmContentLocalRepository
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.data.implementation.ContentRepositoryImpl import com.habitrpg.android.habitica.data.implementation.ContentRepositoryImpl
import com.habitrpg.android.habitica.data.local.ContentLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmContentLocalRepository
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import io.realm.Realm import io.realm.Realm
@ -34,4 +34,4 @@ open class RepositoryModule {
context context
) )
} }
} }

View file

@ -1,56 +1,54 @@
package com.habitrpg.android.habitica.modules package com.habitrpg.android.habitica.modules
import android.content.Context import android.content.Context
import com.habitrpg.android.habitica.data.SetupCustomizationRepository
import com.habitrpg.android.habitica.data.implementation.SetupCustomizationRepositoryImpl
import com.habitrpg.android.habitica.data.local.TaskLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTaskLocalRepository
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.modules.AppModule
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.proxy.AnalyticsManager
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.implementation.TaskRepositoryImpl
import com.habitrpg.android.habitica.data.local.TagLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTagLocalRepository
import com.habitrpg.android.habitica.data.TagRepository
import com.habitrpg.android.habitica.data.implementation.TagRepositoryImpl
import com.habitrpg.android.habitica.data.local.ChallengeLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmChallengeLocalRepository
import com.habitrpg.android.habitica.data.ChallengeRepository import com.habitrpg.android.habitica.data.ChallengeRepository
import com.habitrpg.android.habitica.data.implementation.ChallengeRepositoryImpl
import com.habitrpg.android.habitica.data.local.UserLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmUserLocalRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.data.implementation.UserRepositoryImpl
import com.habitrpg.android.habitica.data.local.SocialLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmSocialLocalRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.implementation.SocialRepositoryImpl
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmInventoryLocalRepository
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.implementation.InventoryRepositoryImpl
import com.habitrpg.android.habitica.data.local.FAQLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmFAQLocalRepository
import com.habitrpg.android.habitica.data.FAQRepository
import com.habitrpg.android.habitica.data.implementation.FAQRepositoryImpl
import com.habitrpg.android.habitica.data.local.TutorialLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTutorialLocalRepository
import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.data.implementation.TutorialRepositoryImpl
import com.habitrpg.android.habitica.data.local.CustomizationLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmCustomizationLocalRepository
import com.habitrpg.android.habitica.data.CustomizationRepository import com.habitrpg.android.habitica.data.CustomizationRepository
import com.habitrpg.android.habitica.data.FAQRepository
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SetupCustomizationRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.TagRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.data.implementation.ChallengeRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.CustomizationRepositoryImpl import com.habitrpg.android.habitica.data.implementation.CustomizationRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.FAQRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.InventoryRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.SetupCustomizationRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.SocialRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.TagRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.TaskRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.TutorialRepositoryImpl
import com.habitrpg.android.habitica.data.implementation.UserRepositoryImpl
import com.habitrpg.android.habitica.data.local.ChallengeLocalRepository
import com.habitrpg.android.habitica.data.local.CustomizationLocalRepository
import com.habitrpg.android.habitica.data.local.FAQLocalRepository
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.data.local.SocialLocalRepository
import com.habitrpg.android.habitica.data.local.TagLocalRepository
import com.habitrpg.android.habitica.data.local.TaskLocalRepository
import com.habitrpg.android.habitica.data.local.TutorialLocalRepository
import com.habitrpg.android.habitica.data.local.UserLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmChallengeLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmCustomizationLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmFAQLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmInventoryLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmSocialLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTagLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTaskLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmTutorialLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmUserLocalRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseHandler import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.UserScope import com.habitrpg.android.habitica.helpers.UserScope
import com.habitrpg.android.habitica.proxy.AnalyticsManager
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import io.realm.Realm import io.realm.Realm
import javax.inject.Named import javax.inject.Named
import javax.inject.Singleton
@Module @Module
class UserRepositoryModule { class UserRepositoryModule {
@ -210,4 +208,4 @@ class UserRepositoryModule {
fun providesPurchaseHandler(context: Context, analyticsManager: AnalyticsManager, apiClient: ApiClient, userViewModel: MainUserViewModel): PurchaseHandler { fun providesPurchaseHandler(context: Context, analyticsManager: AnalyticsManager, apiClient: ApiClient, userViewModel: MainUserViewModel): PurchaseHandler {
return PurchaseHandler(context, analyticsManager, apiClient, userViewModel) return PurchaseHandler(context, analyticsManager, apiClient, userViewModel)
} }
} }

View file

@ -5,7 +5,8 @@ import android.content.res.TypedArray
import android.util.AttributeSet import android.util.AttributeSet
import androidx.preference.DialogPreference import androidx.preference.DialogPreference
import java.text.DateFormat import java.text.DateFormat
import java.util.* import java.util.Calendar
import java.util.Locale
class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctxt, attrs) { class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctxt, attrs) {
private var timeval: String? = null private var timeval: String? = null
@ -54,7 +55,6 @@ class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctx
fun getMinute(timeval: String?): Int { fun getMinute(timeval: String?): Int {
return timeval?.split(":")?.get(1)?.toInt() ?: 0 return timeval?.split(":")?.get(1)?.toInt() ?: 0
} }
} }
@ -62,4 +62,4 @@ class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctx
positiveButtonText = "Set" positiveButtonText = "Set"
negativeButtonText = "Cancel" negativeButtonText = "Cancel"
} }
} }

View file

@ -5,7 +5,6 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.text.Spannable import android.text.Spannable
import android.text.SpannableStringBuilder
import android.widget.Toast import android.widget.Toast
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.RemoteInput import androidx.core.app.RemoteInput

View file

@ -22,7 +22,9 @@ import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
import io.reactivex.rxjava3.functions.BiFunction import io.reactivex.rxjava3.functions.BiFunction
import java.util.* import java.util.Calendar
import java.util.Date
import java.util.Random
import javax.inject.Inject import javax.inject.Inject
@Suppress("DEPRECATION") @Suppress("DEPRECATION")

View file

@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.HLogger
import com.habitrpg.shared.habitica.LogLevel import com.habitrpg.shared.habitica.LogLevel
import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.functions.Consumer
import java.util.*
import javax.inject.Inject import javax.inject.Inject
class TaskReceiver : BroadcastReceiver() { class TaskReceiver : BroadcastReceiver() {
@ -69,8 +68,10 @@ class TaskReceiver : BroadcastReceiver() {
var notificationBuilder = NotificationCompat.Builder(context, "default") var notificationBuilder = NotificationCompat.Builder(context, "default")
.setSmallIcon(R.drawable.ic_gryphon_white) .setSmallIcon(R.drawable.ic_gryphon_white)
.setContentTitle(task.text) .setContentTitle(task.text)
.setStyle(NotificationCompat.BigTextStyle() .setStyle(
.bigText(task.notes)) NotificationCompat.BigTextStyle()
.bigText(task.notes)
)
.setPriority(NotificationCompat.PRIORITY_MAX) .setPriority(NotificationCompat.PRIORITY_MAX)
.setSound(soundUri) .setSound(soundUri)
.setAutoCancel(true) .setAutoCancel(true)

View file

@ -1,7 +1,12 @@
package com.habitrpg.android.habitica.ui package com.habitrpg.android.habitica.ui
import android.content.Context import android.content.Context
import android.graphics.* import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.PointF
import android.graphics.Rect
import android.graphics.RectF
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.text.TextUtils import android.text.TextUtils
import android.util.AttributeSet import android.util.AttributeSet
@ -20,7 +25,8 @@ import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.Avatar
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.functions.Consumer
import java.util.* import java.util.Date
import java.util.EnumMap
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
class AvatarView : FrameLayout { class AvatarView : FrameLayout {

View file

@ -16,7 +16,7 @@ import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import java.util.* import java.util.Locale
import kotlin.math.floor import kotlin.math.floor
class AvatarWithBarsViewModel(private val context: Context, private val binding: AvatarWithBarsBinding, userRepository: UserRepository? = null) { class AvatarWithBarsViewModel(private val context: Context, private val binding: AvatarWithBarsBinding, userRepository: UserRepository? = null) {

Some files were not shown because too many files have changed in this diff Show more