mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Fix ktlint setup
This commit is contained in:
parent
890345ae49
commit
ddd7927c4f
238 changed files with 1264 additions and 963 deletions
128
.github/workflows/android.yml
vendored
128
.github/workflows/android.yml
vendored
|
|
@ -2,14 +2,12 @@ name: Android CI
|
|||
|
||||
on:
|
||||
push:
|
||||
branches: [ develop ]
|
||||
branches: [ develop, release ]
|
||||
pull_request:
|
||||
branches: [ develop ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 11
|
||||
|
|
@ -18,29 +16,17 @@ jobs:
|
|||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
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
|
||||
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:
|
||||
unit-test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 11
|
||||
|
|
@ -49,28 +35,36 @@ jobs:
|
|||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
- name: copy properties file
|
||||
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:
|
||||
source: "habitica.properties.example"
|
||||
target: "habitica.properties"
|
||||
- name: copy resources file
|
||||
uses: canastro/copy-file-action@master
|
||||
arguments: testProdDebugUnitTest
|
||||
|
||||
ui-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 11
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
source: "habitica.resources.example"
|
||||
target: "habitica.resources"
|
||||
- name: copy google services file
|
||||
uses: canastro/copy-file-action@master
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
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:
|
||||
source: "Habitica/google-services.json.example"
|
||||
target: "Habitica/google-services.json"
|
||||
- name: Run Tests
|
||||
run: ./gradlew testProdDebugUnitTest
|
||||
arguments: testProdDebugUnitTest
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 11
|
||||
|
|
@ -79,28 +73,17 @@ jobs:
|
|||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
- name: copy properties file
|
||||
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:
|
||||
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: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
- name: Run Ktlint
|
||||
run: ./gradlew ktlint
|
||||
arguments: ktlint
|
||||
|
||||
detekt:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: set up JDK 11
|
||||
|
|
@ -109,25 +92,14 @@ jobs:
|
|||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
- name: copy properties file
|
||||
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:
|
||||
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: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
- name: Run detekt
|
||||
run: ./gradlew detekt
|
||||
arguments: detekt
|
||||
- name: Upload SARIF to Github using the upload-sarif action
|
||||
uses: github/codeql-action/upload-sarif@v1
|
||||
if: ${{ always() }}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@ dependencies {
|
|||
implementation 'com.google.dagger:dagger:2.40.5'
|
||||
kapt 'com.google.dagger:dagger-compiler:2.40.5'
|
||||
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
|
||||
compileOnly 'com.github.pengrad:jdk9-deps:1.0'
|
||||
//App Compatibility and Material Design
|
||||
implementation 'androidx.appcompat:appcompat:1.4.1'
|
||||
implementation 'com.google.android.material:material:1.5.0'
|
||||
|
|
@ -66,7 +65,7 @@ dependencies {
|
|||
|
||||
|
||||
// IAP Handling / Verification
|
||||
implementation "com.android.billingclient:billing-ktx:4.0.0"
|
||||
implementation "com.android.billingclient:billing-ktx:4.1.0"
|
||||
//Facebook
|
||||
implementation('com.facebook.android:facebook-android-sdk:12.2.0') {
|
||||
transitive = true
|
||||
|
|
@ -96,17 +95,18 @@ dependencies {
|
|||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
androidTestImplementation 'androidx.test:runner: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 "io.mockk:mockk-android:1.12.2"
|
||||
androidTestUtil("androidx.test:orchestrator:1.4.1")
|
||||
|
||||
implementation 'androidx.activity:activity-compose:1.4.0'
|
||||
implementation 'androidx.compose.material:material:1.0.5'
|
||||
implementation 'androidx.compose.animation:animation:1.0.5'
|
||||
implementation 'androidx.compose.ui:ui-tooling:1.0.5'
|
||||
implementation 'androidx.compose.material:material:1.1.1'
|
||||
implementation 'androidx.compose.animation:animation:1.1.1'
|
||||
implementation 'androidx.compose.ui:ui-tooling:1.1.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1'
|
||||
implementation "com.google.accompanist:accompanist-appcompat-theme:0.16.0"
|
||||
|
||||
|
||||
//Leak Detection
|
||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8'
|
||||
//Push Notifications
|
||||
|
|
@ -125,9 +125,8 @@ dependencies {
|
|||
implementation "androidx.lifecycle:lifecycle-common-java8:2.4.1"
|
||||
implementation 'androidx.navigation:navigation-fragment-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.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-android:1.6.0'
|
||||
|
||||
|
|
@ -135,7 +134,7 @@ dependencies {
|
|||
|
||||
implementation project(':shared')
|
||||
|
||||
ktlint("com.pinterest:ktlint:0.43.2") {
|
||||
ktlint("com.pinterest:ktlint:0.45.0") {
|
||||
attributes {
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
|
||||
}
|
||||
|
|
@ -165,6 +164,7 @@ android {
|
|||
targetSdkVersion 32
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
|
|
@ -198,7 +198,6 @@ android {
|
|||
// Disable fabric build ID generation for debug builds
|
||||
ext.enableCrashlytics = false
|
||||
ext.alwaysUpdateBuildId = false
|
||||
testCoverageEnabled = true
|
||||
resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
|
||||
resValue "string", "app_name", "Habitica Debug"
|
||||
}
|
||||
|
|
@ -251,12 +250,6 @@ android {
|
|||
res.srcDirs = ['res']
|
||||
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'] }
|
||||
release { java.srcDirs = ['src/release/java'] }
|
||||
}
|
||||
|
|
@ -292,6 +285,9 @@ android.testOptions {
|
|||
useJUnitPlatform()
|
||||
unitTests.returnDefaultValues = true
|
||||
}
|
||||
unitTests.returnDefaultValues = true
|
||||
|
||||
execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
||||
}
|
||||
|
||||
Properties props = new Properties()
|
||||
|
|
@ -315,7 +311,7 @@ if (propFile.canRead()) {
|
|||
}
|
||||
|
||||
// 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()) {
|
||||
Properties HRPG_PROPS = new Properties()
|
||||
HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE))
|
||||
|
|
@ -334,7 +330,7 @@ if (HRPG_PROPS_FILE.canRead()) {
|
|||
}
|
||||
|
||||
// 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()) {
|
||||
Properties HRPG_RES = new Properties()
|
||||
HRPG_RES.load(new FileInputStream(HRPG_RES_FILE))
|
||||
|
|
@ -404,6 +400,7 @@ task jacocoTestReport(type: JacocoReport, dependsOn: 'testProdDebugUnitTest') {
|
|||
task ktlint(type: JavaExec, group: "verification") {
|
||||
description = "Check Kotlin code style."
|
||||
classpath = configurations.ktlint
|
||||
mainClass.set("com.pinterest.ktlint.Main")
|
||||
args "--disabled_rules=no-wildcard-imports", "--reporter=plain?group_by_file", "src/**/*.kt"
|
||||
// to generate report in checkstyle format prepend following args:
|
||||
// "--reporter=plain", "--reporter=checkstyle,output=${buildDir}/ktlint.xml"
|
||||
|
|
@ -416,5 +413,6 @@ check.dependsOn ktlint
|
|||
task ktlintFormat(type: JavaExec, group: "formatting") {
|
||||
description = "Fix Kotlin code style deviations."
|
||||
classpath = configurations.ktlint
|
||||
args "--disabled_rules=no-wildcard-imports", "-F", "src/**/*.kt"
|
||||
mainClass.set("com.pinterest.ktlint.Main")
|
||||
args "-F", "src/**/*.kt"
|
||||
}
|
||||
|
|
|
|||
BIN
Habitica/libs/LeonidsLib-1.3.2.jar
Normal file
BIN
Habitica/libs/LeonidsLib-1.3.2.jar
Normal file
Binary file not shown.
|
|
@ -10,14 +10,14 @@ import org.junit.Rule
|
|||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
class IntroActivityScreen: Screen<IntroActivityScreen>() {
|
||||
class IntroActivityScreen : Screen<IntroActivityScreen>() {
|
||||
val skipButton = KButton { withId(R.id.skipButton) }
|
||||
val finishButton = KButton { withId(R.id.finishButton )}
|
||||
val finishButton = KButton { withId(R.id.finishButton) }
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class IntroActivityTest: TestCase() {
|
||||
class IntroActivityTest : TestCase() {
|
||||
|
||||
@Rule
|
||||
@JvmField
|
||||
|
|
|
|||
|
|
@ -7,10 +7,8 @@ import com.habitrpg.android.habitica.data.SocialRepository
|
|||
import com.habitrpg.android.habitica.data.TutorialRepository
|
||||
import com.habitrpg.android.habitica.data.UserRepository
|
||||
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.User
|
||||
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment
|
||||
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
|
||||
import io.github.kakaocup.kakao.screen.Screen
|
||||
import io.mockk.clearAllMocks
|
||||
|
|
@ -21,7 +19,7 @@ import io.reactivex.rxjava3.core.Flowable
|
|||
import io.reactivex.rxjava3.subjects.PublishSubject
|
||||
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 fragment: F
|
||||
|
|
@ -50,4 +48,4 @@ abstract class FragmentTestCase<F: BaseFragment<VB>, VB: ViewBinding, S: Screen<
|
|||
every { userRepository.getUser() } returns userEvents
|
||||
makeFragment()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import io.reactivex.rxjava3.core.Flowable
|
|||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
class PartyDetailScreen: Screen<PartyDetailScreen>() {
|
||||
class PartyDetailScreen : Screen<PartyDetailScreen>() {
|
||||
val titleView = KTextView { withId(R.id.title_view) }
|
||||
val newQuestButton = KButton { withId(R.id.new_quest_button) }
|
||||
val questDetailButton = KButton { withId(R.id.quest_detail_button) }
|
||||
|
|
@ -30,7 +30,7 @@ class PartyDetailScreen: Screen<PartyDetailScreen>() {
|
|||
|
||||
@LargeTest
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPartyDetailBinding, PartyDetailScreen>() {
|
||||
class PartyDetailFragmentTest : FragmentTestCase<PartyDetailFragment, FragmentPartyDetailBinding, PartyDetailScreen>() {
|
||||
private lateinit var viewModel: PartyViewModel
|
||||
override val screen = PartyDetailScreen()
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPar
|
|||
viewModel = PartyViewModel(false)
|
||||
viewModel.socialRepository = socialRepository
|
||||
viewModel.userRepository = userRepository
|
||||
viewModel.notificationsManager= mockk(relaxed = true)
|
||||
viewModel.notificationsManager = mockk(relaxed = true)
|
||||
scenario = launchFragmentInContainer(null, R.style.MainAppTheme) {
|
||||
fragment = spyk()
|
||||
fragment.shouldInitializeComponent = false
|
||||
|
|
@ -61,4 +61,4 @@ class PartyDetailFragmentTest: FragmentTestCase<PartyDetailFragment, FragmentPar
|
|||
titleView.hasText("Group Name")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
|
|||
import androidx.test.filters.LargeTest
|
||||
import com.habitrpg.android.habitica.R
|
||||
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.screen.Screen
|
||||
import io.github.kakaocup.kakao.text.KButton
|
||||
|
|
@ -15,23 +15,23 @@ import org.junit.Before
|
|||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
class StatsScreen: Screen<StatsScreen>() {
|
||||
val strengthStatsView = KView { withId(R.id.strengthStatsView)}
|
||||
class StatsScreen : Screen<StatsScreen>() {
|
||||
val strengthStatsView = KView { withId(R.id.strengthStatsView) }
|
||||
val strengthAllocateButton = KButton {
|
||||
withId(R.id.allocateButton)
|
||||
isDescendantOfA { withId(R.id.strengthStatsView) }
|
||||
}
|
||||
val intelligenceStatsView = KView { withId(R.id.intelligenceStatsView)}
|
||||
val intelligenceStatsView = KView { withId(R.id.intelligenceStatsView) }
|
||||
val intelligenceAllocateButton = KButton {
|
||||
withId(R.id.allocateButton)
|
||||
isDescendantOfA { withId(R.id.intelligenceStatsView) }
|
||||
}
|
||||
val constitutionStatsView = KView { withId(R.id.constitutionStatsView)}
|
||||
val constitutionStatsView = KView { withId(R.id.constitutionStatsView) }
|
||||
val constitutionAllocateButton = KButton {
|
||||
withId(R.id.allocateButton)
|
||||
isDescendantOfA { withId(R.id.constitutionStatsView) }
|
||||
}
|
||||
val perceptionStatsView = KView { withId(R.id.perceptionStatsView)}
|
||||
val perceptionStatsView = KView { withId(R.id.perceptionStatsView) }
|
||||
val perceptionAllocateButton = KButton {
|
||||
withId(R.id.allocateButton)
|
||||
isDescendantOfA { withId(R.id.perceptionStatsView) }
|
||||
|
|
@ -41,8 +41,7 @@ class StatsScreen: Screen<StatsScreen>() {
|
|||
|
||||
@LargeTest
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class StatsFragmentTest: FragmentTestCase<StatsFragment, FragmentStatsBinding, StatsScreen>() {
|
||||
|
||||
class StatsFragmentTest : FragmentTestCase<StatsFragment, FragmentStatsBinding, StatsScreen>() {
|
||||
|
||||
override val screen = StatsScreen()
|
||||
|
||||
|
|
@ -92,13 +91,13 @@ class StatsFragmentTest: FragmentTestCase<StatsFragment, FragmentStatsBinding, S
|
|||
fun allocatesOnClick() {
|
||||
screen {
|
||||
strengthAllocateButton.click()
|
||||
verify { userRepository.allocatePoint(Stats.STRENGTH) }
|
||||
verify { userRepository.allocatePoint(Attribute.STRENGTH) }
|
||||
intelligenceAllocateButton.click()
|
||||
verify { userRepository.allocatePoint(Stats.INTELLIGENCE) }
|
||||
verify { userRepository.allocatePoint(Attribute.INTELLIGENCE) }
|
||||
constitutionAllocateButton.click()
|
||||
verify { userRepository.allocatePoint(Stats.CONSTITUTION) }
|
||||
verify { userRepository.allocatePoint(Attribute.CONSTITUTION) }
|
||||
perceptionAllocateButton.click()
|
||||
verify { userRepository.allocatePoint(Stats.PERCEPTION) }
|
||||
verify { userRepository.allocatePoint(Attribute.PERCEPTION) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,27 +1,6 @@
|
|||
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>() {
|
||||
val gems4View = KView { withId(R.id.gems_4_view) }
|
||||
val gems4Button = KTextView {
|
||||
|
|
@ -43,11 +22,6 @@ class GemPurchaseScreen: Screen<GemPurchaseScreen>() {
|
|||
withId(R.id.purchase_button)
|
||||
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
|
||||
|
|
@ -166,4 +140,4 @@ class GemsPurchaseFragmentTest :
|
|||
subscriptionPromo.isGone()
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
|
|||
|
|
@ -1,25 +1,6 @@
|
|||
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>() {
|
||||
val sub1MonthView = KView { withId(R.id.subscription1month) }
|
||||
|
|
@ -100,4 +81,4 @@ class SubscriptionFragmentTest :
|
|||
sub12MonthView.hasDescendant { withText("12 Months") }
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
|
|||
|
|
@ -115,8 +115,8 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
|
|||
val configuration: Configuration = resources.configuration
|
||||
val languageHelper = LanguageHelper(sharedPrefs.getString("language", "en"))
|
||||
if (if (SDK_INT >= Build.VERSION_CODES.N) {
|
||||
configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale
|
||||
} else {
|
||||
configuration.locales.isEmpty || configuration.locales[0] != languageHelper.locale
|
||||
} else {
|
||||
configuration.locale != languageHelper.locale
|
||||
}
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -1,24 +1,52 @@
|
|||
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.TeamPlan
|
||||
import com.habitrpg.android.habitica.models.WorldState
|
||||
import com.habitrpg.android.habitica.models.auth.UserAuth
|
||||
import com.habitrpg.android.habitica.models.auth.UserAuthResponse
|
||||
import com.habitrpg.android.habitica.models.auth.UserAuthSocial
|
||||
import com.habitrpg.android.habitica.models.inventory.Equipment
|
||||
import com.habitrpg.android.habitica.models.inventory.Quest
|
||||
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.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.TaskList
|
||||
import com.habitrpg.android.habitica.models.user.Items
|
||||
import com.habitrpg.android.habitica.models.user.Stats
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
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
|
||||
interface ApiService {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
package com.habitrpg.android.habitica.api;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
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.GroupSerialization;
|
||||
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.OwnedMountListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.NotificationDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.OwnedPetListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.PurchasedDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.QuestCollectDeserializer;
|
||||
|
|
|
|||
|
|
@ -5,10 +5,8 @@ import com.habitrpg.android.habitica.modules.ApiModule;
|
|||
import com.habitrpg.android.habitica.modules.AppModule;
|
||||
import com.habitrpg.android.habitica.modules.DeveloperModule;
|
||||
import com.habitrpg.android.habitica.modules.RepositoryModule;
|
||||
import com.habitrpg.android.habitica.modules.UserRepositoryModule;
|
||||
import com.habitrpg.android.habitica.modules.UserModule;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import com.habitrpg.android.habitica.modules.UserRepositoryModule;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
|
|
|
|||
|
|
@ -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.SkillsFragment;
|
||||
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.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.TavernDetailFragment;
|
||||
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.ChallengeListFragment;
|
||||
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.party.NoPartyFragmentFragment;
|
||||
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.PartyInviteFragment;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,37 @@
|
|||
package com.habitrpg.android.habitica.data
|
||||
|
||||
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.inventory.Equipment
|
||||
import com.habitrpg.android.habitica.models.inventory.Quest
|
||||
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.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.TaskList
|
||||
import com.habitrpg.android.habitica.models.user.Items
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.ContentResult
|
|||
import com.habitrpg.android.habitica.models.WorldState
|
||||
import io.reactivex.rxjava3.core.Flowable
|
||||
|
||||
interface ContentRepository: BaseRepository {
|
||||
interface ContentRepository : BaseRepository {
|
||||
fun retrieveContent(forced: Boolean = false): Flowable<ContentResult>
|
||||
|
||||
fun retrieveWorldState(): Flowable<WorldState>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,23 @@
|
|||
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.FeedResponse
|
||||
import com.habitrpg.android.habitica.models.shops.Shop
|
||||
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
|
||||
|
||||
interface InventoryRepository : BaseRepository {
|
||||
|
|
|
|||
|
|
@ -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.members.Member
|
||||
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 io.reactivex.rxjava3.core.Flowable
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import java.util.*
|
||||
|
||||
interface SocialRepository : BaseRepository {
|
||||
fun getPublicGuilds(): Flowable<out List<Group>>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import com.habitrpg.android.habitica.models.user.User
|
|||
import io.reactivex.rxjava3.core.Flowable
|
||||
import io.reactivex.rxjava3.core.Maybe
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
interface TaskRepository : BaseRepository {
|
||||
fun getTasks(taskType: TaskType, userID: String? = null): Flowable<out List<Task>>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,15 @@ import com.habitrpg.android.habitica.api.HostConfig
|
|||
import com.habitrpg.android.habitica.api.Server
|
||||
import com.habitrpg.android.habitica.data.ApiClient
|
||||
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.UserAuthResponse
|
||||
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.Quest
|
||||
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.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.TaskList
|
||||
import com.habitrpg.android.habitica.models.user.Items
|
||||
|
|
@ -48,7 +70,7 @@ import java.io.IOException
|
|||
import java.net.SocketException
|
||||
import java.net.SocketTimeoutException
|
||||
import java.net.UnknownHostException
|
||||
import java.util.*
|
||||
import java.util.GregorianCalendar
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.net.ssl.SSLException
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.models.ContentResult
|
|||
import com.habitrpg.android.habitica.models.WorldState
|
||||
import com.habitrpg.android.habitica.models.inventory.SpecialItem
|
||||
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 {
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,24 @@ import com.habitrpg.android.habitica.data.ApiClient
|
|||
import com.habitrpg.android.habitica.data.InventoryRepository
|
||||
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
|
||||
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.FeedResponse
|
||||
import com.habitrpg.android.habitica.models.shops.Shop
|
||||
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
|
||||
|
||||
class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClient: ApiClient, userID: String, var appConfigManager: AppConfigManager) : BaseRepositoryImpl<InventoryLocalRepository>(localRepository, apiClient, userID), InventoryRepository {
|
||||
|
|
|
|||
|
|
@ -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.members.Member
|
||||
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 io.reactivex.rxjava3.core.Flowable
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import retrofit2.HttpException
|
||||
import java.util.*
|
||||
import kotlin.collections.HashMap
|
||||
import java.util.UUID
|
||||
|
||||
class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl<SocialLocalRepository>(localRepository, apiClient, userID), SocialRepository {
|
||||
override fun transferGroupOwnership(groupID: String, userID: String): Flowable<Group> {
|
||||
|
|
|
|||
|
|
@ -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.TaskDirectionData
|
||||
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.User
|
||||
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.Single
|
||||
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 {
|
||||
private var lastTaskAction: Long = 0
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ import com.habitrpg.android.habitica.models.user.User
|
|||
import io.reactivex.rxjava3.core.Flowable
|
||||
import io.reactivex.rxjava3.core.Maybe
|
||||
import io.reactivex.rxjava3.functions.BiFunction
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.GregorianCalendar
|
||||
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 {
|
||||
|
|
@ -380,7 +381,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli
|
|||
|
||||
override fun retrieveTeamPlan(teamID: String): Flowable<Group> {
|
||||
return Flowable.zip(
|
||||
apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID)) { team, tasks ->
|
||||
apiClient.getGroup(teamID), apiClient.getTeamPlanTasks(teamID)
|
||||
) { team, tasks ->
|
||||
team.tasks = tasks
|
||||
team
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,16 @@
|
|||
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.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
|
||||
|
||||
interface InventoryLocalRepository : ContentLocalRepository {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
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.Group
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import hu.akarnokd.rxjava3.bridge.RxJavaBridge
|
|||
import io.reactivex.rxjava3.core.Flowable
|
||||
import io.realm.Realm
|
||||
import io.realm.Sort
|
||||
import java.util.*
|
||||
|
||||
class RealmChallengeLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), ChallengeLocalRepository {
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.models.inventory.Customization
|
|||
import hu.akarnokd.rxjava3.bridge.RxJavaBridge
|
||||
import io.reactivex.rxjava3.core.Flowable
|
||||
import io.realm.Realm
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
class RealmCustomizationLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), CustomizationLocalRepository {
|
||||
|
||||
|
|
|
|||
|
|
@ -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.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.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 io.reactivex.rxjava3.core.Flowable
|
||||
import io.realm.Realm
|
||||
import io.realm.RealmObject
|
||||
import io.realm.Sort
|
||||
import io.realm.kotlin.isManaged
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import kotlin.collections.HashMap
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
class RealmInventoryLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), InventoryLocalRepository {
|
||||
override fun getQuestContent(keys: List<String>): Flowable<out List<QuestContent>> {
|
||||
|
|
|
|||
|
|
@ -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.models.inventory.Quest
|
||||
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 hu.akarnokd.rxjava3.bridge.RxJavaBridge
|
||||
import io.reactivex.rxjava3.core.Flowable
|
||||
import io.realm.Realm
|
||||
import io.realm.Sort
|
||||
import java.util.*
|
||||
|
||||
class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), SocialLocalRepository {
|
||||
|
||||
|
|
@ -58,9 +61,9 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm)
|
|||
messages.forEach { it.userID = userID }
|
||||
for (message in messages) {
|
||||
val existingMessage = realm.where(ChatMessage::class.java)
|
||||
.equalTo("id", message.id)
|
||||
.findAll()
|
||||
.firstOrNull()
|
||||
.equalTo("id", message.id)
|
||||
.findAll()
|
||||
.firstOrNull()
|
||||
message.isSeen = existingMessage != null
|
||||
}
|
||||
save(messages)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,12 @@
|
|||
package com.habitrpg.android.habitica.data.local.implementation
|
||||
|
||||
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 hu.akarnokd.rxjava3.bridge.RxJavaBridge
|
||||
import io.reactivex.rxjava3.core.Flowable
|
||||
|
|
|
|||
|
|
@ -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.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.Group
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ package com.habitrpg.android.habitica.executors;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import io.reactivex.rxjava3.core.Scheduler;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Scheduler;
|
||||
|
||||
@Singleton
|
||||
public class UIThread implements PostExecutionThread {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import android.content.Context
|
|||
import android.content.res.Configuration
|
||||
import android.util.TypedValue
|
||||
import android.view.LayoutInflater
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
val Context.layoutInflater: LayoutInflater
|
||||
get() = this.getSystemService(Service.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
|
|
|
|||
|
|
@ -2,9 +2,13 @@ package com.habitrpg.android.habitica.extensions
|
|||
|
||||
import android.content.res.Resources
|
||||
import com.habitrpg.android.habitica.R
|
||||
import java.util.*
|
||||
import java.util.Calendar
|
||||
import java.util.Date
|
||||
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 {
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package com.habitrpg.android.habitica.extensions
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
|
||||
fun withImmutableFlag(flags: Int): Int {
|
||||
|
|
@ -18,4 +17,4 @@ fun withMutableFlag(flags: Int): Int {
|
|||
} else {
|
||||
flags
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import com.amplitude.api.Amplitude
|
|||
import com.habitrpg.android.habitica.BuildConfig
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import java.util.HashMap
|
||||
|
||||
object AmplitudeManager {
|
||||
var EVENT_CATEGORY_BEHAVIOUR = "behaviour"
|
||||
|
|
|
|||
|
|
@ -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.HabiticaWebPromotion
|
||||
import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey
|
||||
import java.util.*
|
||||
|
||||
class AppConfigManager(contentRepository: ContentRepository?) {
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package com.habitrpg.android.habitica.helpers
|
||||
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
class AprilFoolsHandler {
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ import java.io.IOException
|
|||
import java.io.InputStreamReader
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
/*
|
||||
* Copyright (C) 2017 Jared Rummler
|
||||
|
|
@ -434,9 +434,9 @@ object DeviceName {
|
|||
val info = DeviceInfo(json)
|
||||
if (codename.equals(info.codename, ignoreCase = true) && model == null ||
|
||||
codename.equals(
|
||||
info.codename,
|
||||
ignoreCase = true
|
||||
) && model.equals(info.model, ignoreCase = true)
|
||||
info.codename,
|
||||
ignoreCase = true
|
||||
) && model.equals(info.model, ignoreCase = true)
|
||||
) {
|
||||
// Save to SharedPreferences so we don't need to make another request.
|
||||
val editor = prefs.edit()
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package com.habitrpg.android.habitica.helpers
|
|||
|
||||
import android.os.Build
|
||||
import java.text.NumberFormat
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.floor
|
||||
|
||||
|
|
|
|||
|
|
@ -13,11 +13,26 @@ import java.io.ByteArrayInputStream
|
|||
import java.io.ByteArrayOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.UnsupportedEncodingException
|
||||
import java.lang.IllegalStateException
|
||||
import java.math.BigInteger
|
||||
import java.security.*
|
||||
import java.util.*
|
||||
import javax.crypto.*
|
||||
import java.security.GeneralSecurityException
|
||||
import java.security.InvalidAlgorithmParameterException
|
||||
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.SecretKeySpec
|
||||
import javax.security.auth.x500.X500Principal
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package com.habitrpg.android.habitica.helpers
|
||||
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
class LanguageHelper(languageSharedPref: String?) {
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import androidx.navigation.NavController
|
|||
import androidx.navigation.NavDeepLinkRequest
|
||||
import androidx.navigation.NavDirections
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import kotlin.math.abs
|
||||
|
||||
object MainNavigationController {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import io.reactivex.rxjava3.core.Flowable
|
|||
import io.reactivex.rxjava3.subjects.BehaviorSubject
|
||||
import io.reactivex.rxjava3.subjects.PublishSubject
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
class NotificationsManager {
|
||||
private val displayNotificationSubject = PublishSubject.create<Notification>()
|
||||
|
|
@ -19,9 +19,9 @@ class NotificationsManager {
|
|||
private var lastNotificationHandling: Date? = null
|
||||
|
||||
val displayNotificationEvents: Flowable<Notification>
|
||||
get() {
|
||||
return displayNotificationSubject.toFlowable(BackpressureStrategy.DROP)
|
||||
}
|
||||
get() {
|
||||
return displayNotificationSubject.toFlowable(BackpressureStrategy.DROP)
|
||||
}
|
||||
|
||||
init {
|
||||
this.seenNotifications = HashMap()
|
||||
|
|
|
|||
|
|
@ -1,21 +1,27 @@
|
|||
package com.habitrpg.android.habitica.helpers
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.os.bundleOf
|
||||
import com.android.billingclient.api.*
|
||||
import com.android.billingclient.api.BillingClient.ConnectionState.DISCONNECTED
|
||||
import com.google.api.Billing
|
||||
import com.google.firebase.analytics.FirebaseAnalytics
|
||||
import com.android.billingclient.api.AcknowledgePurchaseParams
|
||||
import com.android.billingclient.api.BillingClient
|
||||
import com.android.billingclient.api.BillingClientStateListener
|
||||
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.habitrpg.android.habitica.HabiticaBaseApplication
|
||||
import com.habitrpg.android.habitica.R
|
||||
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.subscribeWithErrorHandler
|
||||
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.views.dialogs.HabiticaAlertDialog
|
||||
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 retrofit2.HttpException
|
||||
|
||||
import java.util.*
|
||||
|
||||
import java.util.Date
|
||||
|
||||
open class PurchaseHandler(
|
||||
private val context: Context,
|
||||
|
|
@ -72,7 +80,6 @@ open class PurchaseHandler(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
init {
|
||||
startListening()
|
||||
}
|
||||
|
|
@ -86,9 +93,9 @@ open class PurchaseHandler(
|
|||
DISCONNECTED;
|
||||
|
||||
val canMaybePurchase: Boolean
|
||||
get() {
|
||||
return this == UNITITIALIZED || this == READY
|
||||
}
|
||||
get() {
|
||||
return this == UNITITIALIZED || this == READY
|
||||
}
|
||||
}
|
||||
|
||||
fun startListening() {
|
||||
|
|
@ -169,7 +176,6 @@ open class PurchaseHandler(
|
|||
.setPurchaseToken(purchase.purchaseToken)
|
||||
.build()
|
||||
billingClient.consumeAsync(params) { result, message ->
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -209,7 +215,8 @@ open class PurchaseHandler(
|
|||
val plan = userViewModel.user.value?.purchased?.plan
|
||||
if (plan?.isActive == true) {
|
||||
if (plan.additionalData?.data?.orderId == purchase.orderId &&
|
||||
(plan.dateTerminated != null == purchase.isAutoRenewing)) {
|
||||
(plan.dateTerminated != null == purchase.isAutoRenewing)
|
||||
) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
@ -291,7 +298,6 @@ open class PurchaseHandler(
|
|||
.flatMap { userViewModel.userRepository.retrieveUser(false, true) }
|
||||
}
|
||||
|
||||
|
||||
private fun durationString(sku: String): String {
|
||||
return when (sku) {
|
||||
PurchaseTypes.Subscription1MonthNoRenew, PurchaseTypes.Subscription1Month -> "1"
|
||||
|
|
@ -383,7 +389,7 @@ open class PurchaseHandler(
|
|||
suspend fun retryUntil(
|
||||
times: Int = Int.MAX_VALUE,
|
||||
initialDelay: Long = 100, // 0.1 second
|
||||
maxDelay: Long = 1000, // 1 second
|
||||
maxDelay: Long = 1000, // 1 second
|
||||
factor: Double = 2.0,
|
||||
block: suspend () -> Boolean
|
||||
) {
|
||||
|
|
@ -393,4 +399,4 @@ suspend fun retryUntil(
|
|||
delay(currentDelay)
|
||||
currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import android.os.Parcel
|
|||
import android.os.Parcelable
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration
|
||||
import java.util.*
|
||||
import java.util.UUID
|
||||
|
||||
class SignInWithAppleService(
|
||||
private val fragmentManager: FragmentManager,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ import com.habitrpg.android.habitica.receivers.TaskReceiver
|
|||
import com.habitrpg.shared.habitica.HLogger
|
||||
import com.habitrpg.shared.habitica.LogLevel
|
||||
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) {
|
||||
private val am: AlarmManager? = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import io.realm.Case
|
|||
import io.realm.OrderedRealmCollection
|
||||
import io.realm.RealmQuery
|
||||
import io.realm.Sort
|
||||
import java.util.*
|
||||
|
||||
class TaskFilterHelper {
|
||||
var searchQuery: String? = null
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import com.habitrpg.android.habitica.R
|
|||
import com.habitrpg.android.habitica.models.Avatar
|
||||
import com.habitrpg.android.habitica.models.inventory.Equipment
|
||||
import com.habitrpg.android.habitica.models.user.Stats
|
||||
import java.util.*
|
||||
|
||||
class UserStatComputer {
|
||||
|
||||
|
|
|
|||
|
|
@ -11,12 +11,12 @@ import androidx.core.app.Person
|
|||
import androidx.core.app.RemoteInput
|
||||
import androidx.core.os.bundleOf
|
||||
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.receivers.LocalNotificationActionReceiver
|
||||
import com.habitrpg.android.habitica.ui.helpers.EmojiParser
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
class GroupActivityNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) {
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import androidx.core.app.NotificationManagerCompat
|
|||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.extensions.withImmutableFlag
|
||||
import com.habitrpg.android.habitica.ui.activities.MainActivity
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
/**
|
||||
* Created by keithholliday on 6/28/16.
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import com.habitrpg.android.habitica.data.ApiClient
|
|||
import com.habitrpg.android.habitica.helpers.AmplitudeManager
|
||||
import com.habitrpg.android.habitica.helpers.RxErrorHandler
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
import java.util.*
|
||||
|
||||
class PushNotificationManager(var apiClient: ApiClient, private val sharedPreferences: SharedPreferences, private val context: Context) {
|
||||
|
||||
|
|
|
|||
|
|
@ -80,4 +80,4 @@ constructor(
|
|||
|
||||
class RequestValues(val pet: Pet, val food: Food, val context: BaseActivity) :
|
||||
UseCase.RequestValues
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,4 +51,4 @@ constructor(private val inventoryRepository: InventoryRepository, postExecutionT
|
|||
}
|
||||
|
||||
class RequestValues(val potion: HatchingPotion, val egg: Egg, val context: BaseActivity) : UseCase.RequestValues
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.util.Pair
|
||||
import com.habitrpg.android.habitica.R
|
||||
|
|
|
|||
|
|
@ -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.user.Stats
|
||||
import com.habitrpg.android.habitica.models.user.User
|
||||
import java.util.*
|
||||
import kotlin.math.min
|
||||
import kotlin.math.pow
|
||||
import kotlin.math.roundToLong
|
||||
|
|
|
|||
|
|
@ -1,6 +1,14 @@
|
|||
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
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,19 @@
|
|||
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 {
|
||||
enum class Type(val type: String) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
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.annotations.PrimaryKey
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models
|
|||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class TutorialStep : RealmObject(), BaseMainObject {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.inventory.QuestRageStrike
|
|||
import io.realm.RealmList
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
|
||||
open class WorldState : RealmObject(), BaseObject {
|
||||
@PrimaryKey
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
|
|||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class WorldStateEvent : RealmObject(), BaseMainObject {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
open class Customization : RealmObject(), BaseObject {
|
||||
@PrimaryKey
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
|
||||
open class Egg : RealmObject(), Item {
|
||||
@PrimaryKey
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.habitrpg.android.habitica.models.BaseMainObject
|
||||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
|
||||
open class Food : RealmObject(), Item {
|
||||
@PrimaryKey
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
|
||||
open class HatchingPotion : RealmObject(), Item {
|
||||
@PrimaryKey
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.habitrpg.android.habitica.models.inventory
|
|||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
open class ItemEvent : RealmObject(), BaseObject {
|
||||
var start: Date? = null
|
||||
|
|
|
|||
|
|
@ -3,9 +3,15 @@ package com.habitrpg.android.habitica.models.members
|
|||
import com.google.gson.annotations.SerializedName
|
||||
import com.habitrpg.android.habitica.models.Avatar
|
||||
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.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.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.promotions
|
|||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.ShapeDrawable
|
||||
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.helpers.MainNavigationController
|
||||
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 java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
class FallExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
|
||||
override val identifier: String
|
||||
|
|
|
|||
|
|
@ -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.views.promo.PromoMenuView
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
|
||||
override val identifier: String
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import com.habitrpg.android.habitica.databinding.FragmentSubscriptionBinding
|
|||
import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
|
||||
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
|
||||
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
enum class PromoType {
|
||||
GEMS_AMOUNT,
|
||||
|
|
@ -18,10 +18,10 @@ enum class PromoType {
|
|||
|
||||
abstract class HabiticaPromotion {
|
||||
val isActive: Boolean
|
||||
get() {
|
||||
val now = Date()
|
||||
return startDate.before(now) && endDate.after(now)
|
||||
}
|
||||
get() {
|
||||
val now = Date()
|
||||
return startDate.before(now) && endDate.after(now)
|
||||
}
|
||||
abstract val identifier: String
|
||||
abstract val promoType: PromoType
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.models.promotions
|
|||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.ShapeDrawable
|
||||
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.helpers.MainNavigationController
|
||||
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 java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
class SpookyExtraGemsHabiticaPromotion(startDate: Date?, endDate: Date?) : HabiticaPromotion() {
|
||||
override val identifier: String
|
||||
|
|
|
|||
|
|
@ -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.PromoWebFragmentArgs
|
||||
import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
class Survey2021Promotion : HabiticaPromotion(), HabiticaWebPromotion {
|
||||
override val identifier: String
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
package com.habitrpg.android.habitica.models.social
|
||||
|
||||
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.user.User
|
||||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.Ignore
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
open class Challenge : RealmObject(), BaseMainObject {
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.BaseObject
|
|||
import com.habitrpg.android.habitica.models.user.ContributorInfo
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
open class InboxConversation : RealmObject(), BaseObject {
|
||||
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@ enum class Attribute constructor(val value: String) {
|
|||
companion object {
|
||||
fun from(type: String?): Attribute? = values().find { it.value == type }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.models.BaseMainObject
|
|||
import io.realm.RealmModel
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
import java.util.UUID
|
||||
|
||||
open class ChecklistItem : RealmObject, BaseMainObject, Parcelable {
|
||||
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@ enum class Frequency constructor(val value: String) {
|
|||
companion object {
|
||||
fun from(type: String?): Frequency? = values().find { it.value == type }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ import io.realm.annotations.Ignore
|
|||
import io.realm.annotations.PrimaryKey
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONException
|
||||
import java.util.ArrayList
|
||||
import java.util.Calendar
|
||||
import java.util.Date
|
||||
import java.util.GregorianCalendar
|
||||
|
|
@ -285,13 +284,10 @@ open class Task : RealmObject, BaseMainObject, Parcelable {
|
|||
streak != task.streak -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
} else if (type == TaskType.TODO) {
|
||||
return dueDate != task.dueDate
|
||||
|
||||
return dueDate != task.dueDate
|
||||
} else if (type == TaskType.REWARD) {
|
||||
return value != task.value
|
||||
|
||||
return value != task.value
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.models.BaseObject
|
|||
import io.realm.RealmList
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class TaskGroupPlan : RealmObject(), BaseObject {
|
||||
|
|
|
|||
|
|
@ -12,4 +12,4 @@ enum class TaskType constructor(val value: String) {
|
|||
companion object {
|
||||
fun from(type: String?): TaskType? = values().find { it.value == type }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,6 @@ import io.realm.RealmObject
|
|||
import io.realm.annotations.RealmClass
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class AdditionalSubscriptionInfo: RealmObject() {
|
||||
open class AdditionalSubscriptionInfo : RealmObject() {
|
||||
var data: GoogleSubscriptionData? = null
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
|
|||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class AuthenticationTimestamps : RealmObject(), BaseObject {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.habitrpg.android.habitica.models.BaseObject
|
|||
import io.realm.RealmList
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class Items : RealmObject, BaseObject {
|
||||
|
|
@ -64,10 +64,10 @@ open class Items : RealmObject, BaseObject {
|
|||
val hasTransformationItems: Boolean
|
||||
get() {
|
||||
return special?.any { transformationItem ->
|
||||
transformationItem.key == ("seafoam") && transformationItem.numberOwned > 0||
|
||||
transformationItem.key == ("shinySeed") && transformationItem.numberOwned > 0||
|
||||
transformationItem.key == ("snowball") && transformationItem.numberOwned > 0||
|
||||
transformationItem.key == ("spookySparkles") && transformationItem.numberOwned > 0
|
||||
transformationItem.key == ("seafoam") && transformationItem.numberOwned > 0 ||
|
||||
transformationItem.key == ("shinySeed") && transformationItem.numberOwned > 0 ||
|
||||
transformationItem.key == ("snowball") && transformationItem.numberOwned > 0 ||
|
||||
transformationItem.key == ("spookySparkles") && transformationItem.numberOwned > 0
|
||||
} ?: false
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import com.habitrpg.android.habitica.models.AvatarPreferences
|
|||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class Preferences : RealmObject(), AvatarPreferences, BaseObject {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
|
|||
import com.habitrpg.android.habitica.models.BaseObject
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class SubscriptionPlan : RealmObject(), BaseObject {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,12 @@ package com.habitrpg.android.habitica.models.user
|
|||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
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.social.ChallengeMembership
|
||||
import com.habitrpg.android.habitica.models.social.UserParty
|
||||
|
|
@ -12,7 +17,7 @@ import io.realm.RealmList
|
|||
import io.realm.RealmObject
|
||||
import io.realm.annotations.Ignore
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
|
||||
open class User : RealmObject(), BaseMainObject, Avatar, VersionedObject {
|
||||
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
package com.habitrpg.android.habitica.modules
|
||||
|
||||
import android.content.Context
|
||||
import com.habitrpg.android.habitica.data.implementation.ApiClientImpl.Companion.createGsonFactory
|
||||
import android.content.SharedPreferences
|
||||
import com.habitrpg.android.habitica.helpers.KeyHelper
|
||||
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.Companion.createGsonFactory
|
||||
import com.habitrpg.android.habitica.helpers.KeyHelper
|
||||
import com.habitrpg.android.habitica.helpers.NotificationsManager
|
||||
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.Provides
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
|
||||
import retrofit2.converter.gson.GsonConverterFactory
|
||||
import java.lang.ref.WeakReference
|
||||
import javax.inject.Singleton
|
||||
|
||||
|
|
|
|||
|
|
@ -7,13 +7,15 @@ import android.content.res.Resources
|
|||
import androidx.preference.PreferenceManager
|
||||
import com.habitrpg.android.habitica.data.ApiClient
|
||||
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.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.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.proxy.AnalyticsManager
|
||||
import com.habitrpg.shared.habitica.HLogger
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
package com.habitrpg.android.habitica.modules
|
||||
|
||||
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.ContentRepository
|
||||
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.Provides
|
||||
import io.realm.Realm
|
||||
|
|
@ -34,4 +34,4 @@ open class RepositoryModule {
|
|||
context
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,56 +1,54 @@
|
|||
package com.habitrpg.android.habitica.modules
|
||||
|
||||
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.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.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.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.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.UserScope
|
||||
import com.habitrpg.android.habitica.proxy.AnalyticsManager
|
||||
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import io.realm.Realm
|
||||
import javax.inject.Named
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
class UserRepositoryModule {
|
||||
|
|
@ -210,4 +208,4 @@ class UserRepositoryModule {
|
|||
fun providesPurchaseHandler(context: Context, analyticsManager: AnalyticsManager, apiClient: ApiClient, userViewModel: MainUserViewModel): PurchaseHandler {
|
||||
return PurchaseHandler(context, analyticsManager, apiClient, userViewModel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ import android.content.res.TypedArray
|
|||
import android.util.AttributeSet
|
||||
import androidx.preference.DialogPreference
|
||||
import java.text.DateFormat
|
||||
import java.util.*
|
||||
import java.util.Calendar
|
||||
import java.util.Locale
|
||||
|
||||
class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctxt, attrs) {
|
||||
private var timeval: String? = null
|
||||
|
|
@ -54,7 +55,6 @@ class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctx
|
|||
|
||||
fun getMinute(timeval: String?): Int {
|
||||
return timeval?.split(":")?.get(1)?.toInt() ?: 0
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -62,4 +62,4 @@ class TimePreference(ctxt: Context, attrs: AttributeSet?) : DialogPreference(ctx
|
|||
positiveButtonText = "Set"
|
||||
negativeButtonText = "Cancel"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import android.content.BroadcastReceiver
|
|||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.widget.Toast
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.core.app.RemoteInput
|
||||
|
|
|
|||
|
|
@ -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.ui.activities.MainActivity
|
||||
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
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity
|
|||
import com.habitrpg.shared.habitica.HLogger
|
||||
import com.habitrpg.shared.habitica.LogLevel
|
||||
import io.reactivex.rxjava3.functions.Consumer
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
class TaskReceiver : BroadcastReceiver() {
|
||||
|
|
@ -69,8 +68,10 @@ class TaskReceiver : BroadcastReceiver() {
|
|||
var notificationBuilder = NotificationCompat.Builder(context, "default")
|
||||
.setSmallIcon(R.drawable.ic_gryphon_white)
|
||||
.setContentTitle(task.text)
|
||||
.setStyle(NotificationCompat.BigTextStyle()
|
||||
.bigText(task.notes))
|
||||
.setStyle(
|
||||
NotificationCompat.BigTextStyle()
|
||||
.bigText(task.notes)
|
||||
)
|
||||
.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||
.setSound(soundUri)
|
||||
.setAutoCancel(true)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,12 @@
|
|||
package com.habitrpg.android.habitica.ui
|
||||
|
||||
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.text.TextUtils
|
||||
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.ui.helpers.DataBindingUtils
|
||||
import io.reactivex.rxjava3.functions.Consumer
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.EnumMap
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
|
||||
class AvatarView : FrameLayout {
|
||||
|
|
|
|||
|
|
@ -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.ui.views.HabiticaIconsHelper
|
||||
import io.reactivex.rxjava3.disposables.Disposable
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
import kotlin.math.floor
|
||||
|
||||
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
Loading…
Reference in a new issue