Big reorganization of code into logical units (#251)
Not much actual code is changed
This commit is contained in:
parent
77e30cf04c
commit
0a4d285d14
@ -24,8 +24,8 @@ android {
|
||||
applicationId "com.h.pixeldroid"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 30
|
||||
versionCode 7
|
||||
versionName "1.0.alpha6"
|
||||
versionCode 8
|
||||
versionName "1.0.alpha7"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||
|
@ -9,9 +9,9 @@ import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.espresso.intent.Intents
|
||||
import androidx.test.espresso.intent.matcher.IntentMatchers
|
||||
import androidx.test.rule.GrantPermissionRule
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.fragments.CameraFragment
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.postCreation.camera.CameraFragment
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
import kotlinx.android.synthetic.main.camera_ui_container.*
|
||||
|
@ -12,9 +12,9 @@ import androidx.test.espresso.matcher.ViewMatchers.*
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
|
||||
import androidx.test.uiautomator.UiDevice
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.testUtility.MockServer
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
|
@ -23,6 +23,7 @@ import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.rule.GrantPermissionRule
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.h.pixeldroid.adapters.ThumbnailAdapter
|
||||
import com.h.pixeldroid.settings.AboutActivity
|
||||
import com.h.pixeldroid.testUtility.CustomMatchers
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import junit.framework.Assert.assertTrue
|
||||
|
@ -11,10 +11,10 @@ import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition
|
||||
import androidx.test.espresso.matcher.ViewMatchers.*
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.fragments.StatusViewHolder
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.posts.StatusViewHolder
|
||||
import com.h.pixeldroid.testUtility.CustomMatchers.Companion.atPosition
|
||||
import com.h.pixeldroid.testUtility.CustomMatchers.Companion.clickChildViewWithId
|
||||
import com.h.pixeldroid.testUtility.CustomMatchers.Companion.first
|
||||
|
@ -23,12 +23,13 @@ import androidx.test.espresso.intent.matcher.IntentMatchers
|
||||
import androidx.test.espresso.matcher.ViewMatchers
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.rule.ActivityTestRule
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.fragments.StatusViewHolder
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_TAG
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.posts.StatusViewHolder
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.ACCOUNT_TAG
|
||||
import com.h.pixeldroid.settings.AboutActivity
|
||||
import com.h.pixeldroid.testUtility.MockServer
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
|
@ -1,27 +1,5 @@
|
||||
package com.h.pixeldroid
|
||||
|
||||
import android.content.Context
|
||||
import androidx.test.core.app.ActivityScenario
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.espresso.Espresso.onView
|
||||
import androidx.test.espresso.action.ViewActions.click
|
||||
import androidx.test.espresso.assertion.ViewAssertions.matches
|
||||
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
||||
import androidx.test.espresso.matcher.ViewMatchers.withId
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
|
||||
import androidx.test.uiautomator.UiDevice
|
||||
import androidx.test.uiautomator.UiSelector
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.rules.Timeout
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/*
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class LoginActivityOfflineTest {
|
||||
|
@ -16,9 +16,9 @@ import androidx.test.espresso.matcher.ViewMatchers.hasErrorText
|
||||
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
||||
import androidx.test.espresso.matcher.ViewMatchers.withId
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.testUtility.MockServer
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
|
@ -16,9 +16,9 @@ import androidx.test.espresso.matcher.ViewMatchers.withId
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.rule.GrantPermissionRule
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.testUtility.MockServer
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
|
@ -13,10 +13,11 @@ import androidx.test.espresso.matcher.ViewMatchers.*
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.objects.*
|
||||
import com.h.pixeldroid.posts.PostActivity
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.api.objects.*
|
||||
import com.h.pixeldroid.testUtility.MockServer
|
||||
import com.h.pixeldroid.testUtility.clearData
|
||||
import com.h.pixeldroid.testUtility.initDB
|
||||
|
@ -2,7 +2,7 @@ package com.h.pixeldroid.testUtility
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import org.ligi.tracedroid.TraceDroid
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.h.pixeldroid.testUtility
|
||||
|
||||
import com.google.gson.Gson
|
||||
import com.h.pixeldroid.objects.Application
|
||||
import com.h.pixeldroid.utils.api.objects.Application
|
||||
|
||||
class JsonValues {
|
||||
companion object {
|
||||
|
@ -15,7 +15,7 @@
|
||||
<uses-feature android:name="android.hardware.location.gps" />
|
||||
|
||||
<application
|
||||
android:name=".Pixeldroid"
|
||||
android:name=".utils.PixelDroidApplication"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
@ -24,31 +24,31 @@
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:allowBackup">
|
||||
<activity android:name=".CameraActivity" />
|
||||
<activity android:name="com.h.pixeldroid.postCreation.camera.CameraActivity" />
|
||||
<activity
|
||||
android:name=".ReportActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity android:name=".PhotoEditActivity" />
|
||||
<activity android:name=".postCreation.photoEdit.PhotoEditActivity" />
|
||||
<activity
|
||||
android:name=".PostCreationActivity"
|
||||
android:name=".postCreation.PostCreationActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".FollowsActivity"
|
||||
android:name=".profile.FollowsActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".PostActivity"
|
||||
android:name=".posts.PostActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".ProfileActivity"
|
||||
android:name=".profile.ProfileActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".SettingsActivity"
|
||||
android:name=".settings.SettingsActivity"
|
||||
android:label="@string/title_activity_settings2"
|
||||
android:parentActivityName=".MainActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
@ -92,7 +92,7 @@
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".SearchActivity"
|
||||
android:name=".searchDiscover.SearchActivity"
|
||||
android:launchMode="singleTop"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity">
|
||||
@ -105,13 +105,13 @@
|
||||
android:resource="@xml/searchable" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".AboutActivity"
|
||||
android:parentActivityName=".SettingsActivity"
|
||||
android:name=".settings.AboutActivity"
|
||||
android:parentActivityName=".settings.SettingsActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
<activity
|
||||
android:name=".LicenseActivity"
|
||||
android:parentActivityName=".AboutActivity"
|
||||
android:name=".settings.LicenseActivity"
|
||||
android:parentActivityName=".settings.AboutActivity"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
tools:ignore="LockedOrientationActivity" />
|
||||
|
||||
|
@ -11,11 +11,13 @@ import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.browser.customtabs.CustomTabsIntent
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.objects.*
|
||||
import com.h.pixeldroid.utils.DBUtils
|
||||
import com.h.pixeldroid.utils.Utils
|
||||
import com.h.pixeldroid.utils.Utils.Companion.normalizeDomain
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.db.addUser
|
||||
import com.h.pixeldroid.utils.db.storeInstance
|
||||
import com.h.pixeldroid.utils.api.objects.*
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.utils.hasInternet
|
||||
import com.h.pixeldroid.utils.normalizeDomain
|
||||
import io.reactivex.Single
|
||||
import io.reactivex.SingleObserver
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
@ -67,7 +69,7 @@ class LoginActivity : BaseActivity() {
|
||||
oauthScheme = getString(R.string.auth_scheme)
|
||||
preferences = getSharedPreferences("$PACKAGE_ID.pref", Context.MODE_PRIVATE)
|
||||
|
||||
if (Utils.hasInternet(applicationContext)) {
|
||||
if (hasInternet(applicationContext)) {
|
||||
connect_instance_button.setOnClickListener {
|
||||
registerAppToServer(normalizeDomain(editText.text.toString()))
|
||||
}
|
||||
@ -269,7 +271,7 @@ class LoginActivity : BaseActivity() {
|
||||
return failedRegistration(getString(R.string.instance_error))
|
||||
}
|
||||
|
||||
DBUtils.storeInstance(db, instance)
|
||||
storeInstance(db, instance)
|
||||
storeUser(token.access_token, token.refresh_token, clientId, clientSecret, instance.uri)
|
||||
wipeSharedSettings()
|
||||
}
|
||||
@ -311,7 +313,7 @@ class LoginActivity : BaseActivity() {
|
||||
if (response.body() != null && response.isSuccessful) {
|
||||
db.userDao().deActivateActiveUsers()
|
||||
val user = response.body() as Account
|
||||
DBUtils.addUser(
|
||||
addUser(
|
||||
db,
|
||||
user,
|
||||
instance,
|
||||
|
@ -16,16 +16,19 @@ import androidx.paging.ExperimentalPagingApi
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import com.bumptech.glide.Glide
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import com.h.pixeldroid.db.entities.HomeStatusDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.fragments.CameraFragment
|
||||
import com.h.pixeldroid.fragments.SearchDiscoverFragment
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.notifications.NotificationsFragment
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds.PostFeedFragment
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.utils.DBUtils
|
||||
import com.h.pixeldroid.utils.Utils.Companion.hasInternet
|
||||
import com.h.pixeldroid.utils.db.addUser
|
||||
import com.h.pixeldroid.postCreation.camera.CameraFragment
|
||||
import com.h.pixeldroid.utils.db.entities.HomeStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.notifications.NotificationsFragment
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.postFeeds.PostFeedFragment
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.profile.ProfileActivity
|
||||
import com.h.pixeldroid.searchDiscover.SearchDiscoverFragment
|
||||
import com.h.pixeldroid.settings.SettingsActivity
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.utils.hasInternet
|
||||
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
|
||||
import com.mikepenz.materialdrawer.iconics.iconicsIcon
|
||||
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
|
||||
@ -193,7 +196,7 @@ class MainActivity : BaseActivity() {
|
||||
) {
|
||||
if (response.body() != null && response.isSuccessful) {
|
||||
val account = response.body() as Account
|
||||
DBUtils.addUser(db, account, domain, accessToken = accessToken, refreshToken = refreshToken, clientId = clientId, clientSecret = clientSecret)
|
||||
addUser(db, account, domain, accessToken = accessToken, refreshToken = refreshToken, clientId = clientId, clientSecret = clientSecret)
|
||||
fillDrawerAccountInfo(account.id!!)
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,9 @@ package com.h.pixeldroid
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import com.h.pixeldroid.objects.Report
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.api.objects.Report
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import kotlinx.android.synthetic.main.activity_report.*
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
|
@ -1,8 +0,0 @@
|
||||
package com.h.pixeldroid.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
||||
data class Context(
|
||||
val ancestors : List<Status>,
|
||||
val descendants : List<Status>
|
||||
) : Serializable
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.postCreation
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
@ -16,12 +16,16 @@ import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.objects.Attachment
|
||||
import com.h.pixeldroid.objects.Instance
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.ProgressRequestBody
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.MainActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.postCreation.camera.CameraActivity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.api.objects.Attachment
|
||||
import com.h.pixeldroid.utils.api.objects.Instance
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.postCreation.photoEdit.PhotoEditActivity
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.schedulers.Schedulers
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.utils
|
||||
package com.h.pixeldroid.postCreation
|
||||
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.subjects.PublishSubject
|
@ -1,10 +1,8 @@
|
||||
package com.h.pixeldroid.utils
|
||||
package com.h.pixeldroid.postCreation
|
||||
|
||||
import android.widget.RelativeLayout
|
||||
import android.os.Build
|
||||
import android.annotation.TargetApi
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.RelativeLayout
|
||||
|
||||
internal class SquareLayout(context: Context, attrs: AttributeSet) :
|
||||
RelativeLayout(context, attrs) {
|
@ -1,7 +1,8 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.postCreation.camera
|
||||
|
||||
import android.os.Bundle
|
||||
import com.h.pixeldroid.fragments.CameraFragment
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.R
|
||||
|
||||
class CameraActivity : BaseActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.postCreation.camera
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
@ -31,8 +31,8 @@ import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.h.pixeldroid.PostCreationActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.postCreation.PostCreationActivity
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.io.File
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.Fragment
|
||||
@ -6,7 +6,6 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.SeekBar
|
||||
import com.h.pixeldroid.PhotoEditActivity
|
||||
import com.h.pixeldroid.R
|
||||
|
||||
class EditImageFragment : Fragment(), SeekBar.OnSeekBarChangeListener {
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.adapters
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
@ -19,7 +19,7 @@ class EditPhotoViewPagerAdapter (manager: FragmentManager):
|
||||
fragmentTitleList.add(title)
|
||||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence? {
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
return fragmentTitleList[position]
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Bundle
|
||||
@ -11,10 +11,7 @@ import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.PhotoEditActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.adapters.ThumbnailAdapter
|
||||
import com.h.pixeldroid.utils.SpaceItemDecoration
|
||||
import com.zomato.photofilters.FilterPack
|
||||
import com.zomato.photofilters.imageprocessors.Filter
|
||||
import com.zomato.photofilters.utils.ThumbnailItem
|
||||
@ -22,10 +19,10 @@ import com.zomato.photofilters.utils.ThumbnailsManager
|
||||
|
||||
class FilterListFragment : Fragment() {
|
||||
|
||||
internal lateinit var recyclerView: RecyclerView
|
||||
internal var listener : PhotoEditActivity? = null
|
||||
private lateinit var recyclerView: RecyclerView
|
||||
private var listener : PhotoEditActivity? = null
|
||||
internal lateinit var adapter: ThumbnailAdapter
|
||||
internal lateinit var tbItemList: MutableList<ThumbnailItem>
|
||||
private lateinit var tbItemList: MutableList<ThumbnailItem>
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.utils
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
@ -29,10 +29,9 @@ import com.bumptech.glide.Glide
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.h.pixeldroid.adapters.EditPhotoViewPagerAdapter
|
||||
import com.h.pixeldroid.fragments.EditImageFragment
|
||||
import com.h.pixeldroid.fragments.FilterListFragment
|
||||
import com.h.pixeldroid.utils.NonSwipeableViewPager
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.postCreation.PostCreationActivity
|
||||
import com.yalantis.ucrop.UCrop
|
||||
import com.zomato.photofilters.imageprocessors.Filter
|
||||
import com.zomato.photofilters.imageprocessors.subfilters.BrightnessSubFilter
|
||||
@ -58,7 +57,7 @@ private val REQUIRED_PERMISSIONS = arrayOf(android.Manifest.permission.READ_EXTE
|
||||
|
||||
class PhotoEditActivity : BaseActivity() {
|
||||
|
||||
internal var saving: Boolean = false
|
||||
private var saving: Boolean = false
|
||||
private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888
|
||||
private val BRIGHTNESS_START = 0
|
||||
private val SATURATION_START = 1.0f
|
||||
@ -74,8 +73,8 @@ class PhotoEditActivity : BaseActivity() {
|
||||
private lateinit var filterListFragment: FilterListFragment
|
||||
private lateinit var editImageFragment: EditImageFragment
|
||||
|
||||
lateinit var viewPager: NonSwipeableViewPager
|
||||
lateinit var tabLayout: TabLayout
|
||||
private lateinit var viewPager: NonSwipeableViewPager
|
||||
private lateinit var tabLayout: TabLayout
|
||||
|
||||
private var brightnessFinal = BRIGHTNESS_START
|
||||
private var saturationFinal = SATURATION_START
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.utils
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.graphics.Rect
|
||||
import android.view.View
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.adapters
|
||||
package com.h.pixeldroid.postCreation.photoEdit
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
@ -8,9 +8,7 @@ import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.PhotoEditActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.fragments.FilterListFragment
|
||||
import com.zomato.photofilters.utils.ThumbnailItem
|
||||
import kotlinx.android.synthetic.main.thumbnail_list_item.view.*
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.utils.customSpans
|
||||
package com.h.pixeldroid.posts
|
||||
|
||||
import android.text.TextPaint
|
||||
import android.text.style.ClickableSpan
|
141
app/src/main/java/com/h/pixeldroid/posts/HtmlUtils.kt
Normal file
141
app/src/main/java/com/h/pixeldroid/posts/HtmlUtils.kt
Normal file
@ -0,0 +1,141 @@
|
||||
package com.h.pixeldroid.posts
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.text.Html
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.Spanned
|
||||
import android.text.style.ClickableSpan
|
||||
import android.text.style.URLSpan
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.core.text.toSpanned
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.getAccountFromId
|
||||
import com.h.pixeldroid.utils.api.objects.Mention
|
||||
import java.net.URI
|
||||
import java.net.URISyntaxException
|
||||
import java.text.ParseException
|
||||
import java.util.*
|
||||
|
||||
fun fromHtml(html: String): Spanned {
|
||||
val result: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
Html.fromHtml(html)
|
||||
}
|
||||
return result.trim().toSpanned()
|
||||
}
|
||||
|
||||
fun getDomain(urlString: String?): String {
|
||||
val uri: URI
|
||||
try {
|
||||
uri = URI(urlString!!)
|
||||
} catch (e: URISyntaxException) {
|
||||
return ""
|
||||
}
|
||||
val host: String = uri.host
|
||||
return if (host.startsWith("www.")) {
|
||||
host.substring(4)
|
||||
} else {
|
||||
host
|
||||
}
|
||||
}
|
||||
|
||||
fun parseHTMLText(
|
||||
text : String,
|
||||
mentions: List<Mention>?,
|
||||
api : PixelfedAPI,
|
||||
context: Context,
|
||||
credential: String
|
||||
) : Spanned {
|
||||
//Convert text to spannable
|
||||
val content = fromHtml(text)
|
||||
|
||||
//Retrive all links that should be made clickable
|
||||
val builder = SpannableStringBuilder(content)
|
||||
val urlSpans = content.getSpans(0, content.length, URLSpan::class.java)
|
||||
|
||||
for(span in urlSpans) {
|
||||
val start = builder.getSpanStart(span)
|
||||
val end = builder.getSpanEnd(span)
|
||||
val flags = builder.getSpanFlags(span)
|
||||
val text = builder.subSequence(start, end)
|
||||
var customSpan: ClickableSpan? = null
|
||||
|
||||
//Handle hashtags
|
||||
if (text[0] == '#') {
|
||||
val tag = text.subSequence(1, text.length).toString()
|
||||
customSpan = object : ClickableSpanNoUnderline() {
|
||||
override fun onClick(widget: View) {
|
||||
Toast.makeText(context, tag, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Handle mentions
|
||||
if(text[0] == '@' && !mentions.isNullOrEmpty()) {
|
||||
val accountUsername = text.subSequence(1, text.length).toString()
|
||||
var id: String? = null
|
||||
|
||||
//Go through all mentions stored in the status
|
||||
for (mention in mentions) {
|
||||
if (mention.username.equals(accountUsername, ignoreCase = true)
|
||||
) {
|
||||
id = mention.id
|
||||
|
||||
//Mentions can be of users in other domains
|
||||
if (mention.url.contains(getDomain(span.url))) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Check that we found a user for the given mention
|
||||
if (id != null) {
|
||||
val accountId: String = id
|
||||
customSpan = object : ClickableSpanNoUnderline() {
|
||||
override fun onClick(widget: View) {
|
||||
Log.e("MENTION", "CLICKED")
|
||||
//Retrieve the account for the given profile
|
||||
getAccountFromId(accountId, api, context, credential)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
builder.removeSpan(span)
|
||||
builder.setSpan(customSpan, start, end, flags)
|
||||
|
||||
// Add zero-width space after links in end of line to fix its too large hitbox.
|
||||
if (end >= builder.length || builder.subSequence(end, end + 1).toString() == "\n") {
|
||||
builder.insert(end, "\u200B")
|
||||
}
|
||||
}
|
||||
|
||||
return builder
|
||||
}
|
||||
|
||||
|
||||
fun setTextViewFromISO8601(date: Date, textView: TextView, absoluteTime: Boolean, context: Context) {
|
||||
val now = Date().time
|
||||
|
||||
try {
|
||||
val then = date.time
|
||||
val formattedDate = android.text.format.DateUtils
|
||||
.getRelativeTimeSpanString(then, now,
|
||||
android.text.format.DateUtils.SECOND_IN_MILLIS,
|
||||
android.text.format.DateUtils.FORMAT_ABBREV_RELATIVE)
|
||||
|
||||
textView.text = if(absoluteTime) context.getString(R.string.posted_on).format(date)
|
||||
else "$formattedDate"
|
||||
|
||||
} catch (e: ParseException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
@ -1,18 +1,19 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.posts
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import com.h.pixeldroid.fragments.PostFragment
|
||||
import com.h.pixeldroid.objects.DiscoverPost
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.objects.Status.Companion.DISCOVER_TAG
|
||||
import com.h.pixeldroid.objects.Status.Companion.DOMAIN_TAG
|
||||
import com.h.pixeldroid.objects.Status.Companion.POST_TAG
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.api.objects.DiscoverPost
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.utils.api.objects.Status.Companion.DISCOVER_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Status.Companion.DOMAIN_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Status.Companion.POST_TAG
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import kotlinx.android.synthetic.main.activity_post.*
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
|
||||
class PostActivity : BaseActivity() {
|
||||
private lateinit var postFragment : PostFragment
|
||||
@ -55,26 +56,24 @@ class PostActivity : BaseActivity() {
|
||||
) {
|
||||
val api = apiHolder.api ?: apiHolder.setDomainToCurrentUser(db)
|
||||
val id = discoverPost.url?.substringAfterLast('/') ?: ""
|
||||
api.getStatus("Bearer $accessToken", id).enqueue(object : Callback<Status> {
|
||||
|
||||
override fun onFailure(call: Call<Status>, t: Throwable) {
|
||||
Log.e("PostActivity:", t.toString())
|
||||
lifecycleScope.launchWhenCreated {
|
||||
try {
|
||||
val status = api.getStatus("Bearer $accessToken", id)
|
||||
postProgressBar.visibility = View.GONE
|
||||
initializeFragment(arguments, status)
|
||||
} catch (exception: IOException) {
|
||||
//TODO show error message
|
||||
Log.e("PostActivity:", exception.toString())
|
||||
} catch (exception: HttpException) {
|
||||
}
|
||||
|
||||
override fun onResponse(call: Call<Status>, response: Response<Status>) {
|
||||
if(response.code() == 200) {
|
||||
val status = response.body()!!
|
||||
postProgressBar.visibility = View.GONE
|
||||
initializeFragment(arguments, status)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private fun initializeFragment(arguments: Bundle, status: Status?){
|
||||
supportActionBar?.title = getString(R.string.post_title).format(status!!.account?.getDisplayName())
|
||||
arguments.putSerializable(POST_TAG, status)
|
||||
postFragment.arguments = arguments
|
||||
supportFragmentManager.isStateSaved
|
||||
supportFragmentManager.beginTransaction()
|
||||
.add(R.id.postFragmentSingle, postFragment).commit()
|
||||
postFragmentSingle.visibility = View.VISIBLE
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.posts
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -6,9 +6,10 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.objects.Status.Companion.DOMAIN_TAG
|
||||
import com.h.pixeldroid.objects.Status.Companion.POST_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.utils.api.objects.Status.Companion.DOMAIN_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Status.Companion.POST_TAG
|
||||
import com.h.pixeldroid.utils.BaseFragment
|
||||
|
||||
|
||||
class PostFragment : BaseFragment() {
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.posts
|
||||
|
||||
import android.Manifest
|
||||
import android.app.AlertDialog
|
||||
@ -24,14 +24,12 @@ import com.google.android.material.snackbar.Snackbar
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.ReportActivity
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.objects.Attachment
|
||||
import com.h.pixeldroid.objects.Context
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.HtmlUtils
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.api.objects.Attachment
|
||||
import com.h.pixeldroid.utils.api.objects.Context
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.utils.ImageConverter
|
||||
import com.h.pixeldroid.utils.Utils
|
||||
import com.karumi.dexter.Dexter
|
||||
import com.karumi.dexter.listener.PermissionDeniedResponse
|
||||
import com.karumi.dexter.listener.PermissionGrantedResponse
|
||||
@ -98,7 +96,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
|
||||
}
|
||||
|
||||
fun setupPost(
|
||||
private fun setupPost(
|
||||
rootView: View,
|
||||
request: RequestBuilder<Drawable>,
|
||||
//homeFragment: Fragment,
|
||||
@ -128,7 +126,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
|
||||
//Convert the date to a readable string
|
||||
Utils.setTextViewFromISO8601(
|
||||
setTextViewFromISO8601(
|
||||
status?.created_at!!,
|
||||
rootView.postDate,
|
||||
isActivity,
|
||||
@ -160,7 +158,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
rootView.findViewById<LinearLayout>(R.id.commentContainer).visibility = View.GONE
|
||||
}
|
||||
|
||||
fun setupPostPics(
|
||||
private fun setupPostPics(
|
||||
rootView: View,
|
||||
request: RequestBuilder<Drawable>,
|
||||
//homeFragment: Fragment
|
||||
@ -192,7 +190,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun setupTabsLayout(
|
||||
private fun setupTabsLayout(
|
||||
rootView: View,
|
||||
request: RequestBuilder<Drawable>,
|
||||
) {
|
||||
@ -209,18 +207,18 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}.attach()
|
||||
}
|
||||
|
||||
fun setDescription(rootView: View, api: PixelfedAPI, credential: String) {
|
||||
private fun setDescription(rootView: View, api: PixelfedAPI, credential: String) {
|
||||
rootView.findViewById<TextView>(R.id.description).apply {
|
||||
if (status?.content.isNullOrBlank()) {
|
||||
visibility = View.GONE
|
||||
} else {
|
||||
text = HtmlUtils.parseHTMLText(status?.content.orEmpty(), status?.mentions, api, rootView.context, credential)
|
||||
text = parseHTMLText(status?.content.orEmpty(), status?.mentions, api, rootView.context, credential)
|
||||
movementMethod = LinkMovementMethod.getInstance()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun activateButtons(holder: StatusViewHolder, api: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope){
|
||||
private fun activateButtons(holder: StatusViewHolder, api: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope){
|
||||
val user = db.userDao().getActiveUser()!!
|
||||
|
||||
val credential = "Bearer ${user.accessToken}"
|
||||
@ -246,7 +244,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
activateMoreButton(holder, api, db, lifecycleScope)
|
||||
}
|
||||
|
||||
fun activateReblogger(
|
||||
private fun activateReblogger(
|
||||
holder: StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -271,7 +269,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun reblogPost(
|
||||
private fun reblogPost(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String
|
||||
@ -301,7 +299,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun undoReblogPost(
|
||||
private fun undoReblogPost(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -331,7 +329,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun activateMoreButton(holder: StatusViewHolder, api: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope){
|
||||
private fun activateMoreButton(holder: StatusViewHolder, api: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope){
|
||||
holder.more.setOnClickListener {
|
||||
PopupMenu(it.context, it).apply {
|
||||
setOnMenuItemClickListener { item ->
|
||||
@ -448,7 +446,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
|
||||
|
||||
fun activateDoubleTapLiker(
|
||||
private fun activateDoubleTapLiker(
|
||||
holder: StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String
|
||||
@ -481,7 +479,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun activateLiker(
|
||||
private fun activateLiker(
|
||||
holder: StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -507,7 +505,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun likePostCall(
|
||||
private fun likePostCall(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -537,7 +535,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun unLikePostCall(
|
||||
private fun unLikePostCall(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -568,7 +566,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun showComments(
|
||||
private fun showComments(
|
||||
holder: StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String
|
||||
@ -589,7 +587,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun activateCommenter(
|
||||
private fun activateCommenter(
|
||||
holder: StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String
|
||||
@ -615,7 +613,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun toggleCommentInput(
|
||||
private fun toggleCommentInput(
|
||||
holder : StatusViewHolder
|
||||
) {
|
||||
//Toggle comment button
|
||||
@ -650,7 +648,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
view.commentText.text = commentContent
|
||||
}
|
||||
|
||||
fun retrieveComments(
|
||||
private fun retrieveComments(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
||||
@ -686,7 +684,7 @@ class StatusViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
}
|
||||
|
||||
fun postComment(
|
||||
private fun postComment(
|
||||
holder : StatusViewHolder,
|
||||
api: PixelfedAPI,
|
||||
credential: String,
|
@ -1,11 +1,7 @@
|
||||
package com.h.pixeldroid.fragments.feeds
|
||||
package com.h.pixeldroid.posts.feeds
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ProgressBar
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.constraintlayout.motion.widget.MotionLayout
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.size
|
||||
import androidx.paging.LoadState
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -17,11 +17,11 @@ import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
import com.h.pixeldroid.databinding.FragmentFeedBinding
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.fragments.BaseFragment
|
||||
import com.h.pixeldroid.fragments.feeds.initAdapter
|
||||
import com.h.pixeldroid.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.utils.BaseFragment
|
||||
import com.h.pixeldroid.posts.feeds.initAdapter
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContentDatabase
|
||||
|
||||
|
||||
/**
|
@ -14,12 +14,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds
|
||||
|
||||
import androidx.paging.*
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContentDatabase
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
@ -14,12 +14,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.paging.*
|
||||
import com.h.pixeldroid.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContentDatabase
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/**
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds.notifications
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds.notifications
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@ -16,22 +16,22 @@ import androidx.paging.PagingDataAdapter
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.h.pixeldroid.PostActivity
|
||||
import com.h.pixeldroid.ProfileActivity
|
||||
import com.h.pixeldroid.posts.PostActivity
|
||||
import com.h.pixeldroid.profile.ProfileActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Notification
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.Utils.Companion.setTextViewFromISO8601
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Notification
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import kotlinx.android.synthetic.main.fragment_notifications.view.*
|
||||
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.CachedFeedFragment
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.utils.HtmlUtils.Companion.parseHTMLText
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.CachedFeedFragment
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.posts.parseHTMLText
|
||||
import com.h.pixeldroid.posts.setTextViewFromISO8601
|
||||
|
||||
|
||||
/**
|
||||
@ -83,48 +83,50 @@ class NotificationViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
}
|
||||
|
||||
private fun Notification.openActivity() {
|
||||
val intent: Intent
|
||||
val intent: Intent =
|
||||
when (type){
|
||||
Notification.NotificationType.mention, Notification.NotificationType.favourite,
|
||||
Notification.NotificationType.poll, Notification.NotificationType.reblog -> {
|
||||
intent = openPostFromNotification()
|
||||
openPostFromNotification()
|
||||
}
|
||||
Notification.NotificationType.follow -> {
|
||||
intent = Intent(itemView.context, ProfileActivity::class.java)
|
||||
intent.putExtra(Account.ACCOUNT_TAG, account)
|
||||
Intent(itemView.context, ProfileActivity::class.java).apply {
|
||||
putExtra(Account.ACCOUNT_TAG, account)
|
||||
}
|
||||
}
|
||||
null -> return //TODO show an error here?
|
||||
}
|
||||
itemView.context.startActivity(intent)
|
||||
}
|
||||
|
||||
private fun Notification.openPostFromNotification(): Intent {
|
||||
val intent = Intent(itemView.context, PostActivity::class.java)
|
||||
intent.putExtra(Status.POST_TAG, status)
|
||||
return intent
|
||||
}
|
||||
private fun Notification.openPostFromNotification(): Intent =
|
||||
Intent(itemView.context, PostActivity::class.java).apply {
|
||||
putExtra(Status.POST_TAG, status)
|
||||
}
|
||||
|
||||
|
||||
private fun setNotificationType(type: Notification.NotificationType, username: String,
|
||||
private fun setNotificationType(type: Notification.NotificationType,
|
||||
username: String,
|
||||
textView: TextView
|
||||
){
|
||||
val context = textView.context
|
||||
val (format: String, drawable: Drawable?) = when(type) {
|
||||
Notification.NotificationType.follow -> {
|
||||
setNotificationTypeTextView(context, R.string.followed_notification, R.drawable.ic_follow)
|
||||
getStringAndDrawable(context, R.string.followed_notification, R.drawable.ic_follow)
|
||||
}
|
||||
Notification.NotificationType.mention -> {
|
||||
setNotificationTypeTextView(context, R.string.mention_notification, R.drawable.ic_apenstaart)
|
||||
getStringAndDrawable(context, R.string.mention_notification, R.drawable.ic_apenstaart)
|
||||
}
|
||||
|
||||
Notification.NotificationType.reblog -> {
|
||||
setNotificationTypeTextView(context, R.string.shared_notification, R.drawable.ic_reblog_blue)
|
||||
getStringAndDrawable(context, R.string.shared_notification, R.drawable.ic_reblog_blue)
|
||||
}
|
||||
|
||||
Notification.NotificationType.favourite -> {
|
||||
setNotificationTypeTextView(context, R.string.liked_notification, R.drawable.ic_like_full)
|
||||
getStringAndDrawable(context, R.string.liked_notification, R.drawable.ic_like_full)
|
||||
}
|
||||
Notification.NotificationType.poll -> {
|
||||
setNotificationTypeTextView(context, R.string.poll_notification, R.drawable.poll)
|
||||
getStringAndDrawable(context, R.string.poll_notification, R.drawable.poll)
|
||||
}
|
||||
}
|
||||
textView.text = format.format(username)
|
||||
@ -132,9 +134,9 @@ class NotificationViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
drawable,null,null,null
|
||||
)
|
||||
}
|
||||
private fun setNotificationTypeTextView(context: Context, format: Int, drawable: Int): Pair<String, Drawable?> {
|
||||
return Pair(context.getString(format), ContextCompat.getDrawable(context, drawable))
|
||||
}
|
||||
|
||||
private fun getStringAndDrawable(context: Context, stringToFormat: Int, drawable: Int): Pair<String, Drawable?>
|
||||
= Pair(context.getString(stringToFormat), ContextCompat.getDrawable(context, drawable))
|
||||
|
||||
|
||||
|
||||
@ -152,7 +154,7 @@ class NotificationViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
photoThumbnail.visibility = View.GONE
|
||||
}
|
||||
|
||||
notification?.type?.let { setNotificationType(it, notification.account.username!!, notificationType) }
|
||||
notification?.type?.let { notification.account?.username?.let { username -> setNotificationType(it, username, notificationType) } }
|
||||
notification?.created_at?.let { setTextViewFromISO8601(it, notificationTime, false, itemView.context) }
|
||||
|
||||
//Convert HTML to clickable text
|
@ -14,13 +14,13 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds.notifications
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds.notifications
|
||||
|
||||
import androidx.paging.*
|
||||
import androidx.room.withTransaction
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.objects.Notification
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.api.objects.Notification
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
import javax.inject.Inject
|
||||
@ -57,7 +57,7 @@ class NotificationsRemoteMediator @Inject constructor(
|
||||
try {
|
||||
val user = db.userDao().getActiveUser()!!
|
||||
val api = apiHolder.api ?: apiHolder.setDomainToCurrentUser(db)
|
||||
val accessToken = user.accessToken.orEmpty()
|
||||
val accessToken = user.accessToken
|
||||
|
||||
val apiResponse = api.notifications("Bearer $accessToken",
|
||||
max_id = max_id,
|
@ -1,10 +1,10 @@
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds.postFeeds
|
||||
|
||||
import androidx.paging.*
|
||||
import androidx.room.withTransaction
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.db.entities.HomeStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.db.entities.HomeStatusDatabaseEntity
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
import javax.inject.Inject
|
||||
@ -42,7 +42,7 @@ class HomeFeedRemoteMediator @Inject constructor(
|
||||
try {
|
||||
val user = db.userDao().getActiveUser()!!
|
||||
val api = apiHolder.api ?: apiHolder.setDomainToCurrentUser(db)
|
||||
val accessToken = user.accessToken.orEmpty()
|
||||
val accessToken = user.accessToken
|
||||
|
||||
val apiResponse = api.timelineHome( "Bearer $accessToken",
|
||||
max_id= max_id, min_id = min_id,
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds.postFeeds
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -12,13 +12,13 @@ import androidx.paging.RemoteMediator
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.fragments.StatusViewHolder
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.CachedFeedFragment
|
||||
import com.h.pixeldroid.fragments.feeds.cachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.FeedContentDao
|
||||
import com.h.pixeldroid.posts.StatusViewHolder
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.CachedFeedFragment
|
||||
import com.h.pixeldroid.posts.feeds.cachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
|
||||
|
||||
/**
|
@ -14,13 +14,13 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds
|
||||
package com.h.pixeldroid.posts.feeds.cachedFeeds.postFeeds
|
||||
|
||||
import androidx.paging.*
|
||||
import androidx.room.withTransaction
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
import javax.inject.Inject
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.paging.*
|
||||
import com.h.pixeldroid.objects.FeedContent
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContent
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/**
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -17,9 +17,9 @@ import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
import com.h.pixeldroid.databinding.FragmentFeedBinding
|
||||
import com.h.pixeldroid.fragments.BaseFragment
|
||||
import com.h.pixeldroid.fragments.feeds.initAdapter
|
||||
import com.h.pixeldroid.objects.FeedContent
|
||||
import com.h.pixeldroid.utils.BaseFragment
|
||||
import com.h.pixeldroid.posts.feeds.initAdapter
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContent
|
||||
|
||||
|
||||
/**
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.accountLists
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
@ -14,12 +14,12 @@ import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.bumptech.glide.Glide
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.UncachedFeedFragment
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_ID_TAG
|
||||
import com.h.pixeldroid.objects.Account.Companion.FOLLOWERS_TAG
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.UncachedFeedFragment
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.ACCOUNT_ID_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.FOLLOWERS_TAG
|
||||
import kotlinx.android.synthetic.main.account_list_entry.view.*
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.accountLists
|
||||
|
||||
import androidx.paging.ExperimentalPagingApi
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import androidx.paging.PagingData
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.UncachedContentRepository
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.UncachedContentRepository
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.accountLists
|
||||
|
||||
import androidx.paging.PagingSource
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.search
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.search
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -6,10 +6,10 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.paging.ExperimentalPagingApi
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.*
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists.AccountAdapter
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.*
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.accountLists.AccountAdapter
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
|
||||
/**
|
||||
* Fragment to show a list of [Account]s, as a result of a search.
|
@ -1,13 +1,13 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.search
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.search
|
||||
|
||||
import androidx.paging.ExperimentalPagingApi
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import androidx.paging.PagingData
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.UncachedContentRepository
|
||||
import com.h.pixeldroid.objects.FeedContent
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.UncachedContentRepository
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContent
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
||||
@ -15,7 +15,7 @@ import javax.inject.Inject
|
||||
* Repository class to perform searches
|
||||
*
|
||||
* The type argument [T] and the [Results.SearchType][type] argument should always
|
||||
* be in agreement, e.g. if [T] is a [com.h.pixeldroid.objects.Account] then
|
||||
* be in agreement, e.g. if [T] is a [com.h.pixeldroid.utils.api.objects.Account] then
|
||||
* [type] should be [Results.SearchType.accounts].
|
||||
*/
|
||||
class SearchContentRepository<T: FeedContent> @ExperimentalPagingApi
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.search
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.search
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
@ -12,12 +12,11 @@ import androidx.paging.PagingDataAdapter
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.UncachedFeedFragment
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.objects.Tag
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.UncachedFeedFragment
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.FeedViewModel
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.ViewModelFactory
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
import com.h.pixeldroid.utils.api.objects.Tag
|
||||
import kotlinx.android.synthetic.main.fragment_tags.view.*
|
||||
|
||||
/**
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.search
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.search
|
||||
|
||||
import androidx.paging.PagingSource
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.objects.FeedContent
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContent
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
import retrofit2.HttpException
|
||||
import java.io.IOException
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments.feeds.uncachedFeeds.search
|
||||
package com.h.pixeldroid.posts.feeds.uncachedFeeds.search
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
@ -11,10 +11,10 @@ import androidx.paging.PagingDataAdapter
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.fragments.StatusViewHolder
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.*
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.posts.StatusViewHolder
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.*
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
|
||||
/**
|
||||
* Fragment to show a list of [Status]es, as a result of a search.
|
@ -1,11 +1,13 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.profile
|
||||
|
||||
import android.os.Bundle
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists.AccountListFragment
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_ID_TAG
|
||||
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_TAG
|
||||
import com.h.pixeldroid.objects.Account.Companion.FOLLOWERS_TAG
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.accountLists.AccountListFragment
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.ACCOUNT_ID_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.ACCOUNT_TAG
|
||||
import com.h.pixeldroid.utils.api.objects.Account.Companion.FOLLOWERS_TAG
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
|
||||
|
||||
class FollowsActivity : BaseActivity() {
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.profile
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.Typeface
|
||||
@ -13,13 +13,15 @@ import androidx.core.content.ContextCompat
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.adapters.ProfilePostsRecyclerViewAdapter
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Relationship
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.HtmlUtils.Companion.parseHTMLText
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Relationship
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.posts.parseHTMLText
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.utils.ImageConverter
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
@ -7,9 +7,9 @@ import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import androidx.appcompat.content.res.AppCompatResources.getDrawable
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.h.pixeldroid.PostActivity
|
||||
import com.h.pixeldroid.posts.PostActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.utils.ImageConverter.Companion.setSquareImageFromDrawable
|
||||
import com.h.pixeldroid.utils.ImageConverter.Companion.setSquareImageFromURL
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.searchDiscover
|
||||
|
||||
import android.app.SearchManager
|
||||
import android.content.Intent
|
||||
@ -8,10 +8,12 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.search.SearchAccountFragment
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.search.SearchHashtagFragment
|
||||
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.search.SearchPostsFragment
|
||||
import com.h.pixeldroid.objects.Results
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.search.SearchAccountFragment
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.search.SearchHashtagFragment
|
||||
import com.h.pixeldroid.posts.feeds.uncachedFeeds.search.SearchPostsFragment
|
||||
import com.h.pixeldroid.utils.api.objects.Results
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
|
||||
class SearchActivity : BaseActivity() {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.searchDiscover
|
||||
|
||||
import android.app.SearchManager
|
||||
import android.content.Context
|
||||
@ -12,20 +12,17 @@ import android.widget.*
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.constraintlayout.motion.widget.MotionLayout
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
import com.h.pixeldroid.Pixeldroid
|
||||
import com.h.pixeldroid.PostActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.adapters.ProfilePostViewHolder
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.objects.DiscoverPost
|
||||
import com.h.pixeldroid.objects.DiscoverPosts
|
||||
import com.h.pixeldroid.objects.Status
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.utils.api.objects.DiscoverPost
|
||||
import com.h.pixeldroid.utils.api.objects.DiscoverPosts
|
||||
import com.h.pixeldroid.utils.api.objects.Status
|
||||
import com.h.pixeldroid.posts.PostActivity
|
||||
import com.h.pixeldroid.utils.BaseFragment
|
||||
import com.h.pixeldroid.utils.ImageConverter
|
||||
import com.mikepenz.iconics.IconicsColor
|
||||
import com.mikepenz.iconics.IconicsDrawable
|
||||
@ -33,11 +30,9 @@ import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
|
||||
import com.mikepenz.iconics.utils.color
|
||||
import com.mikepenz.iconics.utils.paddingDp
|
||||
import com.mikepenz.iconics.utils.sizeDp
|
||||
import kotlinx.android.synthetic.main.fragment_search.*
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* This fragment lets you search and use Pixelfed's Discover feature
|
@ -1,7 +1,10 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.settings
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.h.pixeldroid.BuildConfig
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import kotlinx.android.synthetic.main.activity_about.*
|
||||
|
||||
class AboutActivity : BaseActivity() {
|
@ -1,6 +1,8 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.settings
|
||||
|
||||
import android.os.Bundle
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import kotlinx.android.synthetic.main.activity_licenses.*
|
||||
|
||||
|
@ -1,11 +1,14 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.settings
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.h.pixeldroid.utils.ThemeUtils.Companion.setThemeFromPreferences
|
||||
import com.h.pixeldroid.MainActivity
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.utils.BaseActivity
|
||||
import com.h.pixeldroid.utils.setThemeFromPreferences
|
||||
|
||||
class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
private var restartMainOnExit = false
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
@ -7,8 +7,8 @@ import android.os.Build
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@ -21,7 +21,7 @@ open class BaseActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
(this.application as Pixeldroid).getAppComponent().inject(this)
|
||||
(this.application as PixelDroidApplication).getAppComponent().inject(this)
|
||||
}
|
||||
|
||||
override fun attachBaseContext(base: Context) {
|
@ -1,10 +1,9 @@
|
||||
package com.h.pixeldroid.fragments
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.h.pixeldroid.Pixeldroid
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.di.PixelfedAPIHolder
|
||||
import com.h.pixeldroid.utils.db.AppDatabase
|
||||
import com.h.pixeldroid.utils.di.PixelfedAPIHolder
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@ -20,7 +19,7 @@ open class BaseFragment: Fragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
(requireActivity().application as Pixeldroid).getAppComponent().inject(this)
|
||||
(requireActivity().application as PixelDroidApplication).getAppComponent().inject(this)
|
||||
}
|
||||
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import com.h.pixeldroid.db.AppDatabase
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.objects.Account
|
||||
import com.h.pixeldroid.objects.Instance
|
||||
import com.h.pixeldroid.utils.Utils.Companion.normalizeDomain
|
||||
|
||||
class DBUtils {
|
||||
companion object {
|
||||
private const val MAX_NUMBER_OF_STORED_POSTS = 200
|
||||
|
||||
private fun normalizeOrNot(uri: String): String{
|
||||
return if(uri.startsWith("http://localhost")){
|
||||
uri
|
||||
} else {
|
||||
normalizeDomain(uri)
|
||||
}
|
||||
}
|
||||
|
||||
fun addUser(db: AppDatabase, account: Account, instance_uri: String, activeUser: Boolean = true,
|
||||
accessToken: String, refreshToken: String?, clientId: String, clientSecret: String) {
|
||||
db.userDao().insertUser(
|
||||
UserDatabaseEntity(
|
||||
user_id = account.id!!,
|
||||
//make sure not to normalize to https when localhost, to allow testing
|
||||
instance_uri = normalizeOrNot(instance_uri),
|
||||
username = account.username!!,
|
||||
display_name = account.getDisplayName(),
|
||||
avatar_static = account.avatar_static.orEmpty(),
|
||||
isActive = activeUser,
|
||||
accessToken = accessToken,
|
||||
refreshToken = refreshToken,
|
||||
clientId = clientId,
|
||||
clientSecret = clientSecret
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun storeInstance(db: AppDatabase, instance: Instance) {
|
||||
val maxTootChars = instance.max_toot_chars?.toInt() ?: Instance.DEFAULT_MAX_TOOT_CHARS
|
||||
val dbInstance = InstanceDatabaseEntity(
|
||||
//make sure not to normalize to https when localhost, to allow testing
|
||||
uri = normalizeOrNot(instance.uri.orEmpty()),
|
||||
title = instance.title.orEmpty(),
|
||||
max_toot_chars = maxTootChars,
|
||||
thumbnail = instance.thumbnail.orEmpty()
|
||||
)
|
||||
db.instanceDao().insertInstance(dbInstance)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.text.Html
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.Spanned
|
||||
import android.text.style.ClickableSpan
|
||||
import android.text.style.URLSpan
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.core.text.toSpanned
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.objects.Account.Companion.getAccountFromId
|
||||
import com.h.pixeldroid.objects.Mention
|
||||
import com.h.pixeldroid.utils.customSpans.ClickableSpanNoUnderline
|
||||
import java.net.URI
|
||||
import java.net.URISyntaxException
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
class HtmlUtils {
|
||||
companion object {
|
||||
|
||||
fun fromHtml(html: String): Spanned {
|
||||
val result: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
|
||||
} else {
|
||||
Html.fromHtml(html)
|
||||
}
|
||||
return result.trim().toSpanned()
|
||||
}
|
||||
|
||||
fun getDomain(urlString: String?): String {
|
||||
val uri: URI
|
||||
try {
|
||||
uri = URI(urlString!!)
|
||||
} catch (e: URISyntaxException) {
|
||||
return ""
|
||||
}
|
||||
val host: String = uri.host
|
||||
return if (host.startsWith("www.")) {
|
||||
host.substring(4)
|
||||
} else {
|
||||
host
|
||||
}
|
||||
}
|
||||
|
||||
fun parseHTMLText(
|
||||
text : String,
|
||||
mentions: List<Mention>?,
|
||||
api : PixelfedAPI,
|
||||
context: Context,
|
||||
credential: String
|
||||
) : Spanned {
|
||||
//Convert text to spannable
|
||||
val content = fromHtml(text)
|
||||
|
||||
//Retrive all links that should be made clickable
|
||||
val builder = SpannableStringBuilder(content)
|
||||
val urlSpans = content.getSpans(0, content.length, URLSpan::class.java)
|
||||
|
||||
for(span in urlSpans) {
|
||||
val start = builder.getSpanStart(span)
|
||||
val end = builder.getSpanEnd(span)
|
||||
val flags = builder.getSpanFlags(span)
|
||||
val text = builder.subSequence(start, end)
|
||||
var customSpan: ClickableSpan? = null
|
||||
|
||||
//Handle hashtags
|
||||
if (text[0] == '#') {
|
||||
val tag = text.subSequence(1, text.length).toString()
|
||||
customSpan = object : ClickableSpanNoUnderline() {
|
||||
override fun onClick(widget: View) {
|
||||
Toast.makeText(context, tag, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Handle mentions
|
||||
if(text[0] == '@' && !mentions.isNullOrEmpty()) {
|
||||
val accountUsername = text.subSequence(1, text.length).toString()
|
||||
var id: String? = null
|
||||
|
||||
//Go through all mentions stored in the status
|
||||
for (mention in mentions) {
|
||||
if (mention.username.toLowerCase(Locale.ROOT)
|
||||
== accountUsername.toLowerCase(Locale.ROOT)
|
||||
) {
|
||||
id = mention.id
|
||||
|
||||
//Mentions can be of users in other domains
|
||||
if (mention.url.contains(getDomain(span.url))) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Check that we found a user for the given mention
|
||||
if (id != null) {
|
||||
val accountId: String = id
|
||||
customSpan = object : ClickableSpanNoUnderline() {
|
||||
override fun onClick(widget: View) {
|
||||
Log.e("MENTION", "CLICKED")
|
||||
//Retrieve the account for the given profile
|
||||
getAccountFromId(accountId, api, context, credential)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
builder.removeSpan(span)
|
||||
builder.setSpan(customSpan, start, end, flags)
|
||||
|
||||
// Add zero-width space after links in end of line to fix its too large hitbox.
|
||||
if (end >= builder.length || builder.subSequence(end, end + 1).toString() == "\n") {
|
||||
builder.insert(end, "\u200B")
|
||||
}
|
||||
}
|
||||
|
||||
return builder
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,13 @@
|
||||
package com.h.pixeldroid
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.app.Application
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.h.pixeldroid.di.*
|
||||
import com.h.pixeldroid.utils.ThemeUtils
|
||||
import com.h.pixeldroid.utils.di.*
|
||||
import com.mikepenz.iconics.Iconics
|
||||
import org.ligi.tracedroid.TraceDroid
|
||||
|
||||
|
||||
class Pixeldroid: Application() {
|
||||
class PixelDroidApplication: Application() {
|
||||
|
||||
private lateinit var mApplicationComponent: ApplicationComponent
|
||||
|
||||
@ -17,7 +16,7 @@ class Pixeldroid: Application() {
|
||||
TraceDroid.init(this)
|
||||
val sharedPreferences =
|
||||
PreferenceManager.getDefaultSharedPreferences(this)
|
||||
ThemeUtils.setThemeFromPreferences(sharedPreferences, resources)
|
||||
setThemeFromPreferences(sharedPreferences, resources)
|
||||
mApplicationComponent = DaggerApplicationComponent
|
||||
.builder()
|
||||
.applicationModule(ApplicationModule(this))
|
@ -1,17 +0,0 @@
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.graphics.ColorMatrix
|
||||
|
||||
abstract class PostUtils {
|
||||
companion object {
|
||||
|
||||
fun censorColorMatrix(): ColorMatrix {
|
||||
val array: FloatArray = floatArrayOf( 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 1f, 0f )
|
||||
return ColorMatrix(array)
|
||||
}
|
||||
|
||||
fun uncensorColorMatrix(): ColorMatrix {
|
||||
return ColorMatrix()
|
||||
}
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import android.content.res.Resources
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import com.h.pixeldroid.R
|
||||
|
||||
class ThemeUtils {
|
||||
companion object {
|
||||
/**
|
||||
* @brief Updates the application's theme depending on the given preferences and resources
|
||||
*/
|
||||
fun setThemeFromPreferences(preferences: SharedPreferences, resources : Resources) {
|
||||
val themes = resources.getStringArray(R.array.theme_values)
|
||||
val theme = preferences.getString("theme", "")
|
||||
//Set the theme
|
||||
when(theme) {
|
||||
//Light
|
||||
themes[1] -> {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
}
|
||||
//Dark
|
||||
themes[2] -> {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
}
|
||||
else -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
} else {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +1,47 @@
|
||||
package com.h.pixeldroid.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.content.res.Resources
|
||||
import android.net.ConnectivityManager
|
||||
import android.widget.TextView
|
||||
import android.os.Build
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import com.h.pixeldroid.R
|
||||
import java.text.ParseException
|
||||
import java.util.Date
|
||||
|
||||
class Utils {
|
||||
companion object {
|
||||
fun hasInternet(context: Context): Boolean {
|
||||
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
return cm.activeNetwork != null
|
||||
fun hasInternet(context: Context): Boolean {
|
||||
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
return cm.activeNetwork != null
|
||||
}
|
||||
|
||||
fun normalizeDomain(domain: String): String {
|
||||
return "https://" + domain
|
||||
.replace("http://", "")
|
||||
.replace("https://", "")
|
||||
.trim(Char::isWhitespace)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Updates the application's theme depending on the given preferences and resources
|
||||
*/
|
||||
fun setThemeFromPreferences(preferences: SharedPreferences, resources : Resources) {
|
||||
val themes = resources.getStringArray(R.array.theme_values)
|
||||
//Set the theme
|
||||
when(preferences.getString("theme", "")) {
|
||||
//Light
|
||||
themes[1] -> {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
}
|
||||
|
||||
fun normalizeDomain(domain: String): String {
|
||||
return "https://" + domain
|
||||
.replace("http://", "")
|
||||
.replace("https://", "")
|
||||
.trim(Char::isWhitespace)
|
||||
//Dark
|
||||
themes[2] -> {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
}
|
||||
|
||||
|
||||
fun setTextViewFromISO8601(date: Date, textView: TextView, absoluteTime: Boolean, context: Context) {
|
||||
val now = Date().time
|
||||
|
||||
try {
|
||||
val then = date.time
|
||||
val formattedDate = android.text.format.DateUtils
|
||||
.getRelativeTimeSpanString(then, now,
|
||||
android.text.format.DateUtils.SECOND_IN_MILLIS,
|
||||
android.text.format.DateUtils.FORMAT_ABBREV_RELATIVE)
|
||||
|
||||
textView.text = if(absoluteTime) context.getString(R.string.posted_on).format(date)
|
||||
else "$formattedDate"
|
||||
|
||||
} catch (e: ParseException) {
|
||||
e.printStackTrace()
|
||||
else -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
} else {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.h.pixeldroid.api
|
||||
package com.h.pixeldroid.utils.api
|
||||
|
||||
import com.h.pixeldroid.objects.*
|
||||
import com.h.pixeldroid.utils.api.objects.*
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
import okhttp3.MultipartBody
|
||||
@ -249,10 +249,10 @@ interface PixelfedAPI {
|
||||
): Call<Account>
|
||||
|
||||
@GET("/api/v1/statuses/{id}")
|
||||
fun getStatus(
|
||||
suspend fun getStatus(
|
||||
@Header("Authorization") authorization: String,
|
||||
@Path("id") accountId : String
|
||||
): Call<Status>
|
||||
): Status
|
||||
|
||||
@Multipart
|
||||
@POST("/api/v1/media")
|
@ -1,11 +1,11 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import androidx.core.content.ContextCompat.startActivity
|
||||
import com.h.pixeldroid.ProfileActivity
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.profile.ProfileActivity
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -0,0 +1,8 @@
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
||||
data class Context(
|
||||
val ancestors : List<Status>,
|
||||
val descendants : List<Status>
|
||||
) : Serializable
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
interface FeedContent {
|
||||
val id: String?
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
data class History(
|
||||
//Required attributes
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
data class Instance (
|
||||
val description: String?,
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
/*
|
||||
See https://nodeinfo.diaspora.software/schema.html and https://pixelfed.social/api/nodeinfo/2.0.json
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.ForeignKey
|
||||
import androidx.room.Index
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import java.io.Serializable
|
||||
import java.util.Date
|
||||
|
||||
@ -26,9 +26,9 @@ https://docs.joinmastodon.org/entities/notification/
|
||||
data class Notification(
|
||||
//Required attributes
|
||||
override val id: String,
|
||||
val type: NotificationType,
|
||||
val created_at: Date, //ISO 8601 Datetime
|
||||
val account: Account,
|
||||
val type: NotificationType?,
|
||||
val created_at: Date?, //ISO 8601 Datetime
|
||||
val account: Account?,
|
||||
//Optional attributes
|
||||
val status: Status? = null,
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,9 +1,10 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.database.Cursor
|
||||
import android.graphics.ColorMatrix
|
||||
import android.graphics.ColorMatrixColorFilter
|
||||
import android.net.Uri
|
||||
import android.os.Environment
|
||||
@ -14,17 +15,11 @@ import android.view.View.VISIBLE
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.core.net.toUri
|
||||
import androidx.room.Entity
|
||||
import androidx.room.ForeignKey
|
||||
import androidx.room.Index
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.h.pixeldroid.R
|
||||
import com.h.pixeldroid.api.PixelfedAPI
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.HtmlUtils.Companion.getDomain
|
||||
import com.h.pixeldroid.utils.HtmlUtils.Companion.parseHTMLText
|
||||
import com.h.pixeldroid.utils.PostUtils.Companion.censorColorMatrix
|
||||
import com.h.pixeldroid.utils.PostUtils.Companion.uncensorColorMatrix
|
||||
import com.h.pixeldroid.utils.api.PixelfedAPI
|
||||
import com.h.pixeldroid.posts.getDomain
|
||||
import com.h.pixeldroid.posts.parseHTMLText
|
||||
import kotlinx.android.synthetic.main.post_fragment.view.*
|
||||
import java.io.File
|
||||
import java.io.Serializable
|
||||
@ -107,11 +102,13 @@ open class Status(
|
||||
|
||||
// Set dark layout and warning message
|
||||
view.sensitiveWarning.visibility = VISIBLE
|
||||
view.postPicture.colorFilter = ColorMatrixColorFilter(censorColorMatrix())
|
||||
val array = floatArrayOf(0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 1f, 0f)
|
||||
val censorMatrix = ColorMatrix(array)
|
||||
view.postPicture.colorFilter = ColorMatrixColorFilter(censorMatrix)
|
||||
|
||||
fun uncensorPicture(view: View) {
|
||||
view.sensitiveWarning.visibility = GONE
|
||||
view.postPicture.colorFilter = ColorMatrixColorFilter(uncensorColorMatrix())
|
||||
view.postPicture.clearColorFilter()
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
import java.io.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.h.pixeldroid.objects
|
||||
package com.h.pixeldroid.utils.api.objects
|
||||
|
||||
data class Token(
|
||||
val access_token: String?,
|
@ -1,17 +1,17 @@
|
||||
package com.h.pixeldroid.db
|
||||
package com.h.pixeldroid.utils.db
|
||||
|
||||
import androidx.room.Database
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.room.TypeConverters
|
||||
import com.h.pixeldroid.db.dao.*
|
||||
import com.h.pixeldroid.db.dao.feedContent.NotificationDao
|
||||
import com.h.pixeldroid.db.dao.feedContent.posts.HomePostDao
|
||||
import com.h.pixeldroid.db.dao.feedContent.posts.PublicPostDao
|
||||
import com.h.pixeldroid.db.entities.HomeStatusDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.objects.Notification
|
||||
import com.h.pixeldroid.utils.db.dao.*
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.NotificationDao
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.posts.HomePostDao
|
||||
import com.h.pixeldroid.utils.db.dao.feedContent.posts.PublicPostDao
|
||||
import com.h.pixeldroid.utils.db.entities.HomeStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.PublicFeedStatusDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.api.objects.Notification
|
||||
|
||||
@Database(entities = [
|
||||
InstanceDatabaseEntity::class,
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.db
|
||||
package com.h.pixeldroid.utils.db
|
||||
|
||||
import androidx.room.TypeConverter
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.h.pixeldroid.objects.*
|
||||
import com.h.pixeldroid.utils.api.objects.*
|
||||
import java.util.*
|
||||
|
||||
class Converters {
|
46
app/src/main/java/com/h/pixeldroid/utils/db/DBUtils.kt
Normal file
46
app/src/main/java/com/h/pixeldroid/utils/db/DBUtils.kt
Normal file
@ -0,0 +1,46 @@
|
||||
package com.h.pixeldroid.utils.db
|
||||
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.api.objects.Account
|
||||
import com.h.pixeldroid.utils.api.objects.Instance
|
||||
import com.h.pixeldroid.utils.normalizeDomain
|
||||
|
||||
private fun normalizeOrNot(uri: String): String{
|
||||
return if(uri.startsWith("http://localhost")){
|
||||
uri
|
||||
} else {
|
||||
normalizeDomain(uri)
|
||||
}
|
||||
}
|
||||
|
||||
fun addUser(db: AppDatabase, account: Account, instance_uri: String, activeUser: Boolean = true,
|
||||
accessToken: String, refreshToken: String?, clientId: String, clientSecret: String) {
|
||||
db.userDao().insertUser(
|
||||
UserDatabaseEntity(
|
||||
user_id = account.id!!,
|
||||
//make sure not to normalize to https when localhost, to allow testing
|
||||
instance_uri = normalizeOrNot(instance_uri),
|
||||
username = account.username!!,
|
||||
display_name = account.getDisplayName(),
|
||||
avatar_static = account.avatar_static.orEmpty(),
|
||||
isActive = activeUser,
|
||||
accessToken = accessToken,
|
||||
refreshToken = refreshToken,
|
||||
clientId = clientId,
|
||||
clientSecret = clientSecret
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun storeInstance(db: AppDatabase, instance: Instance) {
|
||||
val maxTootChars = instance.max_toot_chars?.toInt() ?: Instance.DEFAULT_MAX_TOOT_CHARS
|
||||
val dbInstance = InstanceDatabaseEntity(
|
||||
//make sure not to normalize to https when localhost, to allow testing
|
||||
uri = normalizeOrNot(instance.uri.orEmpty()),
|
||||
title = instance.title.orEmpty(),
|
||||
max_toot_chars = maxTootChars,
|
||||
thumbnail = instance.thumbnail.orEmpty()
|
||||
)
|
||||
db.instanceDao().insertInstance(dbInstance)
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package com.h.pixeldroid.db.dao
|
||||
package com.h.pixeldroid.utils.db.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import com.h.pixeldroid.db.entities.InstanceDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity
|
||||
|
||||
@Dao
|
||||
interface InstanceDao {
|
@ -1,10 +1,10 @@
|
||||
package com.h.pixeldroid.db.dao
|
||||
package com.h.pixeldroid.utils.db.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import com.h.pixeldroid.db.entities.UserDatabaseEntity
|
||||
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
|
||||
|
||||
@Dao
|
||||
interface UserDao {
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.db.dao.feedContent
|
||||
package com.h.pixeldroid.utils.db.dao.feedContent
|
||||
|
||||
import androidx.paging.PagingSource
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import com.h.pixeldroid.objects.FeedContentDatabase
|
||||
import com.h.pixeldroid.utils.api.objects.FeedContentDatabase
|
||||
|
||||
interface FeedContentDao<T: FeedContentDatabase>{
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.h.pixeldroid.db.dao.feedContent
|
||||
package com.h.pixeldroid.utils.db.dao.feedContent
|
||||
|
||||
import androidx.paging.PagingSource
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Query
|
||||
import com.h.pixeldroid.objects.Notification
|
||||
import com.h.pixeldroid.utils.api.objects.Notification
|
||||
|
||||
@Dao
|
||||
interface NotificationDao: FeedContentDao<Notification> {
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user