Fix ktlint setup

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

View file

@ -2,14 +2,12 @@ name: Android CI
on:
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() }}

View file

@ -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"
}

Binary file not shown.

View file

@ -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

View file

@ -7,10 +7,8 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.data.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()
}
}
}

View file

@ -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")
}
}
}
}

View file

@ -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) }
}
}
}
}

View file

@ -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()
}
}
}
}*/

View file

@ -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") }
}
}
}
}*/

View file

@ -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
}
) {

View file

@ -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 {

View file

@ -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;

View file

@ -5,10 +5,8 @@ import com.habitrpg.android.habitica.modules.ApiModule;
import com.habitrpg.android.habitica.modules.AppModule;
import com.habitrpg.android.habitica.modules.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;

View file

@ -76,19 +76,19 @@ import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.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;

View file

@ -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

View file

@ -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>

View file

@ -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 {

View file

@ -4,11 +4,14 @@ import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.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>>

View file

@ -11,7 +11,7 @@ import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.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>>

View file

@ -13,7 +13,15 @@ import com.habitrpg.android.habitica.api.HostConfig
import com.habitrpg.android.habitica.api.Server
import com.habitrpg.android.habitica.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

View file

@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.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 {

View file

@ -4,12 +4,24 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.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 {

View file

@ -9,13 +9,16 @@ import com.habitrpg.android.habitica.models.Achievement
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.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> {

View file

@ -12,7 +12,11 @@ import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData
import com.habitrpg.android.habitica.models.responses.TaskDirection
import com.habitrpg.android.habitica.models.responses.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

View file

@ -26,7 +26,8 @@ import com.habitrpg.android.habitica.models.user.User
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.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
}

View file

@ -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 {

View file

@ -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

View file

@ -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 {

View file

@ -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 {

View file

@ -2,18 +2,29 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.InventoryLocalRepository
import com.habitrpg.android.habitica.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>> {

View file

@ -3,13 +3,16 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.SocialLocalRepository
import com.habitrpg.android.habitica.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)

View file

@ -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

View file

@ -2,7 +2,12 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.UserLocalRepository
import com.habitrpg.android.habitica.data.local.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

View file

@ -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 {

View file

@ -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

View file

@ -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 {

View file

@ -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
}
}
}

View file

@ -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"

View file

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

View file

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

View file

@ -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()

View file

@ -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

View file

@ -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

View file

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

View file

@ -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 {

View file

@ -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()

View file

@ -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)
}
}
}

View file

@ -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,

View file

@ -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

View file

@ -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

View file

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

View file

@ -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) {

View file

@ -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.

View file

@ -9,7 +9,6 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.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) {

View file

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

View file

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

View file

@ -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

View file

@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.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

View file

@ -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
/**

View file

@ -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) {

View file

@ -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

View file

@ -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 {

View file

@ -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

View file

@ -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 {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -16,7 +16,8 @@ import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment
import com.habitrpg.android.habitica.ui.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

View file

@ -7,7 +7,7 @@ import com.habitrpg.android.habitica.databinding.FragmentSubscriptionBinding
import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
import com.habitrpg.android.habitica.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

View file

@ -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

View file

@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
import com.habitrpg.android.habitica.ui.fragments.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

View file

@ -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 {

View file

@ -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 {

View file

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

View file

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

View file

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

View file

@ -15,7 +15,6 @@ import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import 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
}

View file

@ -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 {

View file

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

View file

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

View file

@ -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 {

View file

@ -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
}
}

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {

View file

@ -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

View file

@ -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

View file

@ -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
)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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"
}
}
}

View file

@ -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

View file

@ -22,7 +22,9 @@ import com.habitrpg.android.habitica.models.tasks.TaskType
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.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")

View file

@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.shared.habitica.HLogger
import com.habitrpg.shared.habitica.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)

View file

@ -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 {

View file

@ -16,7 +16,7 @@ import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.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