2020-02-28 17:08:54 +01:00
package com.h.pixeldroid
2021-05-15 11:58:28 +02:00
import android.app.AlertDialog
2020-03-13 11:48:45 +01:00
import android.content.Context
2020-03-06 08:49:26 +01:00
import android.content.Intent
2020-05-19 09:49:34 +02:00
import android.graphics.drawable.Drawable
import android.net.Uri
2020-02-28 17:08:54 +01:00
import android.os.Bundle
2020-05-01 11:26:18 +02:00
import android.util.Log
import android.view.View
2020-05-19 09:49:34 +02:00
import android.widget.ImageView
2020-03-08 12:54:18 +01:00
import androidx.appcompat.app.AppCompatActivity
2020-11-27 17:02:52 +01:00
import androidx.core.content.ContextCompat
2020-03-05 21:07:10 +01:00
import androidx.core.view.GravityCompat
2020-03-12 22:23:25 +01:00
import androidx.fragment.app.Fragment
2020-12-29 19:34:48 +01:00
import androidx.lifecycle.lifecycleScope
2020-11-27 17:02:52 +01:00
import androidx.paging.ExperimentalPagingApi
2020-03-13 11:48:45 +01:00
import androidx.viewpager2.adapter.FragmentStateAdapter
2020-05-19 09:49:34 +02:00
import com.bumptech.glide.Glide
2020-03-13 11:48:45 +01:00
import com.google.android.material.tabs.TabLayoutMediator
2021-01-13 01:28:08 +01:00
import com.h.pixeldroid.databinding.ActivityMainBinding
2020-12-26 12:10:54 +01:00
import com.h.pixeldroid.postCreation.camera.CameraFragment
import com.h.pixeldroid.posts.feeds.cachedFeeds.notifications.NotificationsFragment
import com.h.pixeldroid.posts.feeds.cachedFeeds.postFeeds.PostFeedFragment
import com.h.pixeldroid.profile.ProfileActivity
import com.h.pixeldroid.searchDiscover.SearchDiscoverFragment
import com.h.pixeldroid.settings.SettingsActivity
import com.h.pixeldroid.utils.BaseActivity
2021-01-13 01:28:08 +01:00
import com.h.pixeldroid.utils.db.addUser
import com.h.pixeldroid.utils.db.entities.HomeStatusDatabaseEntity
import com.h.pixeldroid.utils.db.entities.PublicFeedStatusDatabaseEntity
import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity
2020-12-26 12:10:54 +01:00
import com.h.pixeldroid.utils.hasInternet
2021-05-15 11:58:28 +02:00
import com.h.pixeldroid.utils.openUrl
2020-05-19 09:49:34 +02:00
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.materialdrawer.iconics.iconicsIcon
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem
import com.mikepenz.materialdrawer.model.interfaces.*
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
import com.mikepenz.materialdrawer.util.DrawerImageLoader
import com.mikepenz.materialdrawer.widget.AccountHeaderView
2021-03-19 10:34:43 +01:00
import org.ligi.tracedroid.sending.sendTraceDroidStackTracesIfExist
2020-12-29 19:34:48 +01:00
import retrofit2.HttpException
import java.io.IOException
2020-03-13 12:17:17 +01:00
2020-12-11 16:53:12 +01:00
class MainActivity : BaseActivity ( ) {
2020-03-05 21:07:10 +01:00
2020-05-19 09:49:34 +02:00
private lateinit var header : AccountHeaderView
private var user : UserDatabaseEntity ? = null
companion object {
const val ADD _ACCOUNT _IDENTIFIER : Long = - 13
}
2020-03-13 11:48:45 +01:00
2021-01-13 01:28:08 +01:00
private lateinit var binding : ActivityMainBinding
2020-11-27 17:02:52 +01:00
@ExperimentalPagingApi
2020-02-28 17:08:54 +01:00
override fun onCreate ( savedInstanceState : Bundle ? ) {
2020-04-23 19:49:30 +02:00
setTheme ( R . style . AppTheme _NoActionBar )
2020-02-28 17:08:54 +01:00
super . onCreate ( savedInstanceState )
2021-01-13 01:28:08 +01:00
binding = ActivityMainBinding . inflate ( layoutInflater )
setContentView ( binding . root )
2020-03-05 21:07:10 +01:00
2020-05-19 09:49:34 +02:00
//get the currently active user
user = db . userDao ( ) . getActiveUser ( )
2020-03-13 11:48:45 +01:00
//Check if we have logged in and gotten an access token
2020-05-19 09:49:34 +02:00
if ( user == null ) {
launchActivity ( LoginActivity ( ) , firstTime = true )
2021-02-05 14:48:12 +01:00
finish ( )
As a user I want to be able to see posts in a feed (#28)
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* fixed another merge problem
* trying my best to merge
* removed drawable definition in activity_post.xml
* implements swipe motion
add a new class to implement swipe motion
add the swipe right from home page to display settings
passed the homepage in a fragment
* transform profile activity into fragment
transformed profile activity and layout into fragment
linked it with a swipe motion
* Implement swipeable tabs
* Ask for login on first start, add API endpoints, change profile to show the user's profile
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* layout changes
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* Add tests
* delete test for now
* Adapt test to changes (no more profile from drawer)
* Add unit test for api
* Add test for profile, refactor to allow testing, add exception to security policy to allow tests
* Adapt test to new situation
* Fix typo due to change
* refactor somewhat
* added a feed test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* WIP posts
* WIP posts
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* added a feed test
* added a working feed test
* fixed broken test
* merged with master
* added a max height for images and made profile pictures round
* Added a default image for the post
* created a PostActivity to look a single posts
* fixed buggy postActivity
* Complete overhall of the feed UI
* removed test that didn't please Travis
* removed legacy test
* changed feedAdapter init location (outside of network callback)
Co-authored-by: Matthieu <61561059+Wv5twkFEKh54vo4tta9yu7dHa3@users.noreply.github.com>
Co-authored-by: Ulysse Widmer <ulysse.widmer@epfl.ch>
2020-03-16 09:38:35 +01:00
} else {
2021-03-19 10:34:43 +01:00
sendTraceDroidStackTracesIfExist ( " contact@pixeldroid.org " , this )
2020-05-01 11:26:18 +02:00
setupDrawer ( )
2020-11-27 17:02:52 +01:00
2020-12-19 13:22:45 +01:00
val tabs : List < ( ) -> Fragment > = listOf (
{
PostFeedFragment < HomeStatusDatabaseEntity > ( )
. apply {
arguments = Bundle ( ) . apply { putBoolean ( " home " , true ) }
}
2020-11-27 17:02:52 +01:00
} ,
2020-12-19 13:22:45 +01:00
{ SearchDiscoverFragment ( ) } ,
{ CameraFragment ( ) } ,
{ NotificationsFragment ( ) } ,
{
PostFeedFragment < PublicFeedStatusDatabaseEntity > ( )
. apply {
arguments = Bundle ( ) . apply { putBoolean ( " home " , false ) }
}
2020-11-27 17:02:52 +01:00
}
2020-04-10 12:55:02 +02:00
)
As a user I want to be able to see posts in a feed (#28)
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* fixed another merge problem
* trying my best to merge
* removed drawable definition in activity_post.xml
* implements swipe motion
add a new class to implement swipe motion
add the swipe right from home page to display settings
passed the homepage in a fragment
* transform profile activity into fragment
transformed profile activity and layout into fragment
linked it with a swipe motion
* Implement swipeable tabs
* Ask for login on first start, add API endpoints, change profile to show the user's profile
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* layout changes
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* Add tests
* delete test for now
* Adapt test to changes (no more profile from drawer)
* Add unit test for api
* Add test for profile, refactor to allow testing, add exception to security policy to allow tests
* Adapt test to new situation
* Fix typo due to change
* refactor somewhat
* added a feed test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* WIP posts
* WIP posts
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* added a feed test
* added a working feed test
* fixed broken test
* merged with master
* added a max height for images and made profile pictures round
* Added a default image for the post
* created a PostActivity to look a single posts
* fixed buggy postActivity
* Complete overhall of the feed UI
* removed test that didn't please Travis
* removed legacy test
* changed feedAdapter init location (outside of network callback)
Co-authored-by: Matthieu <61561059+Wv5twkFEKh54vo4tta9yu7dHa3@users.noreply.github.com>
Co-authored-by: Ulysse Widmer <ulysse.widmer@epfl.ch>
2020-03-16 09:38:35 +01:00
setupTabs ( tabs )
2021-05-15 11:58:28 +02:00
AlertDialog . Builder ( this ) . apply {
setMessage ( " PixelDroid is now published on the main F-Droid repo. The version from the IzzyOnDroid repo is very out of date. Press OK to go to the main F-Droid repo to get the new and improved version, and don't forget to uninstall this version. " )
setPositiveButton ( android . R . string . ok ) { _ , _ -> openUrl ( " https://f-droid.org/en/packages/org.pixeldroid.app/ " ) }
setNegativeButton ( android . R . string . cancel ) { _ , _ -> }
} . show ( )
As a user I want to be able to see posts in a feed (#28)
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* fixed another merge problem
* trying my best to merge
* removed drawable definition in activity_post.xml
* implements swipe motion
add a new class to implement swipe motion
add the swipe right from home page to display settings
passed the homepage in a fragment
* transform profile activity into fragment
transformed profile activity and layout into fragment
linked it with a swipe motion
* Implement swipeable tabs
* Ask for login on first start, add API endpoints, change profile to show the user's profile
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* layout changes
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* Add tests
* delete test for now
* Adapt test to changes (no more profile from drawer)
* Add unit test for api
* Add test for profile, refactor to allow testing, add exception to security policy to allow tests
* Adapt test to new situation
* Fix typo due to change
* refactor somewhat
* added a feed test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* WIP posts
* WIP posts
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* added a feed test
* added a working feed test
* fixed broken test
* merged with master
* added a max height for images and made profile pictures round
* Added a default image for the post
* created a PostActivity to look a single posts
* fixed buggy postActivity
* Complete overhall of the feed UI
* removed test that didn't please Travis
* removed legacy test
* changed feedAdapter init location (outside of network callback)
Co-authored-by: Matthieu <61561059+Wv5twkFEKh54vo4tta9yu7dHa3@users.noreply.github.com>
Co-authored-by: Ulysse Widmer <ulysse.widmer@epfl.ch>
2020-03-16 09:38:35 +01:00
}
2020-05-01 11:26:18 +02:00
}
2020-04-30 20:01:35 +02:00
2020-05-01 11:26:18 +02:00
private fun setupDrawer ( ) {
2021-01-13 01:28:08 +01:00
binding . mainDrawerButton . setOnClickListener {
binding . drawerLayout . open ( )
2020-09-13 23:35:09 +02:00
}
2020-05-19 09:49:34 +02:00
header = AccountHeaderView ( this ) . apply {
headerBackgroundScaleType = ImageView . ScaleType . CENTER _CROP
currentHiddenInList = true
onAccountHeaderListener = { _ : View ? , profile : IProfile , current : Boolean ->
clickProfile ( profile , current )
}
addProfile ( ProfileSettingDrawerItem ( ) . apply {
identifier = ADD _ACCOUNT _IDENTIFIER
nameRes = R . string . add _account _name
descriptionRes = R . string . add _account _description
iconicsIcon = GoogleMaterial . Icon . gmd _add
} , 0 )
2021-01-13 01:28:08 +01:00
attachToSliderView ( binding . drawer )
2020-05-19 09:49:34 +02:00
dividerBelowHeader = false
closeDrawerOnProfileListClick = true
}
DrawerImageLoader . init ( object : AbstractDrawerImageLoader ( ) {
override fun set ( imageView : ImageView , uri : Uri , placeholder : Drawable , tag : String ? ) {
Glide . with ( imageView . context )
. load ( uri )
. placeholder ( placeholder )
. into ( imageView )
}
override fun cancel ( imageView : ImageView ) {
Glide . with ( imageView . context ) . clear ( imageView )
}
override fun placeholder ( ctx : Context , tag : String ? ) : Drawable {
if ( tag == DrawerImageLoader . Tags . PROFILE . name || tag == DrawerImageLoader . Tags . PROFILE_DRAWER_ITEM . name ) {
2020-11-27 17:02:52 +01:00
return ContextCompat . getDrawable ( ctx , R . drawable . ic _default _user ) !!
2020-05-19 09:49:34 +02:00
}
return super . placeholder ( ctx , tag )
}
} )
fillDrawerAccountInfo ( user !! . user _id )
//after setting with the values in the db, we make sure to update the database and apply
//with the received one. This happens asynchronously.
getUpdatedAccount ( )
2021-01-13 01:28:08 +01:00
binding . drawer . itemAdapter . add (
2020-05-19 09:49:34 +02:00
primaryDrawerItem {
nameRes = R . string . menu _account
iconicsIcon = GoogleMaterial . Icon . gmd _person
} ,
primaryDrawerItem {
nameRes = R . string . menu _settings
iconicsIcon = GoogleMaterial . Icon . gmd _settings
} ,
primaryDrawerItem {
nameRes = R . string . logout
iconicsIcon = GoogleMaterial . Icon . gmd _close
} )
2021-01-13 01:28:08 +01:00
binding . drawer . onDrawerItemClickListener = { v , drawerItem , position ->
2020-05-19 09:49:34 +02:00
when ( position ) {
1 -> launchActivity ( ProfileActivity ( ) )
2 -> launchActivity ( SettingsActivity ( ) )
3 -> logOut ( )
}
false
}
}
private fun logOut ( ) {
2021-01-05 00:38:16 +01:00
db . runInTransaction {
db . userDao ( ) . deleteActiveUsers ( )
val remainingUsers = db . userDao ( ) . getAll ( )
if ( remainingUsers . isEmpty ( ) ) {
//no more users, start first-time login flow
launchActivity ( LoginActivity ( ) , firstTime = true )
} else {
val newActive = remainingUsers . first ( )
db . userDao ( ) . activateUser ( newActive . user _id )
2021-04-20 14:07:18 +02:00
apiHolder . setToCurrentUser ( )
2021-01-05 00:38:16 +01:00
//relaunch the app
launchActivity ( MainActivity ( ) , firstTime = true )
}
2020-05-19 09:49:34 +02:00
}
}
2020-07-26 20:56:01 +02:00
private fun getUpdatedAccount ( ) {
2020-05-14 20:14:41 +02:00
if ( hasInternet ( applicationContext ) ) {
2020-05-01 11:26:18 +02:00
2020-12-29 19:34:48 +01:00
lifecycleScope . launchWhenCreated {
try {
2021-04-18 22:32:50 +02:00
val domain = user ?. instance _uri . orEmpty ( )
val accessToken = user ?. accessToken . orEmpty ( )
val refreshToken = user ?. refreshToken
val clientId = user ?. clientId . orEmpty ( )
val clientSecret = user ?. clientSecret . orEmpty ( )
2021-04-20 14:07:18 +02:00
val api = apiHolder . api ?: apiHolder . setToCurrentUser ( )
2021-04-18 22:32:50 +02:00
val account = api . verifyCredentials ( )
2020-12-29 19:34:48 +01:00
addUser ( db , account , domain , accessToken = accessToken , refreshToken = refreshToken , clientId = clientId , clientSecret = clientSecret )
fillDrawerAccountInfo ( account . id !! )
} catch ( exception : IOException ) {
Log . e ( " ACCOUNT UPDATE: " , exception . toString ( ) )
} catch ( exception : HttpException ) {
Log . e ( " ACCOUNT UPDATE: " , exception . toString ( ) )
}
}
2020-05-14 20:14:41 +02:00
}
2020-03-12 22:23:25 +01:00
}
2020-03-04 18:04:55 +01:00
2020-05-19 09:49:34 +02:00
//called when switching profiles, or when clicking on current profile
private fun clickProfile ( profile : IProfile , current : Boolean ) : Boolean {
if ( current ) {
launchActivity ( ProfileActivity ( ) )
return false
}
//Clicked on add new account
if ( profile . identifier == ADD _ACCOUNT _IDENTIFIER ) {
launchActivity ( LoginActivity ( ) )
return false
}
2020-07-26 20:56:01 +02:00
db . userDao ( ) . deActivateActiveUsers ( )
2020-05-19 09:49:34 +02:00
db . userDao ( ) . activateUser ( profile . identifier . toString ( ) )
2021-04-20 14:07:18 +02:00
apiHolder . setToCurrentUser ( )
2020-05-19 09:49:34 +02:00
val intent = Intent ( this , MainActivity :: class . java )
intent . flags = Intent . FLAG _ACTIVITY _NEW _TASK or Intent . FLAG _ACTIVITY _CLEAR _TASK
startActivity ( intent )
return false
}
private inline fun primaryDrawerItem ( block : PrimaryDrawerItem . ( ) -> Unit ) : PrimaryDrawerItem {
return PrimaryDrawerItem ( )
. apply {
isSelectable = false
isIconTinted = true
}
. apply ( block )
}
private fun fillDrawerAccountInfo ( account : String ) {
val users = db . userDao ( ) . getAll ( ) . toMutableList ( )
2020-12-19 13:22:45 +01:00
users . sortWith { l , r ->
2020-05-19 09:49:34 +02:00
when {
l . isActive && ! r . isActive -> - 1
r . isActive && ! l . isActive -> 1
else -> 0
}
2020-12-19 13:22:45 +01:00
}
2020-05-19 09:49:34 +02:00
val profiles : MutableList < IProfile > = users . map { user ->
ProfileDrawerItem ( ) . apply {
isSelected = user . isActive
nameText = user . display _name
iconUrl = user . avatar _static
isNameShown = true
identifier = user . user _id . toLong ( )
2020-11-01 18:44:32 +01:00
descriptionText = " @ ${user.username} @ ${user.instance_uri.removePrefix("https://")} "
2020-05-19 09:49:34 +02:00
}
} . toMutableList ( )
// reuse the already existing "add account" item
2020-11-01 18:44:32 +01:00
header . profiles . orEmpty ( )
. filter { it . identifier == ADD _ACCOUNT _IDENTIFIER }
. take ( 1 )
2020-11-06 14:49:49 +01:00
. forEach { profiles . add ( it ) }
2020-11-01 18:44:32 +01:00
2020-05-19 09:49:34 +02:00
header . clear ( )
header . profiles = profiles
header . setActiveProfile ( account . toLong ( ) )
2020-05-14 20:14:41 +02:00
}
2020-05-01 11:26:18 +02:00
2020-05-19 09:49:34 +02:00
2020-12-19 13:22:45 +01:00
private fun setupTabs ( tab _array : List < ( ) -> Fragment > ) {
2021-01-13 01:28:08 +01:00
binding . viewPager . adapter = object : FragmentStateAdapter ( this ) {
2020-03-13 11:48:45 +01:00
override fun createFragment ( position : Int ) : Fragment {
2020-12-19 13:22:45 +01:00
return tab _array [ position ] ( )
2020-03-13 11:48:45 +01:00
}
2020-03-12 22:23:25 +01:00
2020-03-13 11:48:45 +01:00
override fun getItemCount ( ) : Int {
2020-11-27 17:02:52 +01:00
return tab _array . size
2020-03-13 11:48:45 +01:00
}
}
2020-11-27 17:02:52 +01:00
2021-01-13 01:28:08 +01:00
TabLayoutMediator ( binding . tabs , binding . viewPager ) { tab , position ->
2020-11-27 17:02:52 +01:00
tab . icon = ContextCompat . getDrawable ( applicationContext ,
when ( position ) {
0 -> R . drawable . ic _home _white _24dp
1 -> R . drawable . ic _search _white _24dp
2 -> R . drawable . ic _photo _camera _white _24dp
3 -> R . drawable . ic _heart
4 -> R . drawable . ic _filter _black _24dp
else -> throw IllegalArgumentException ( )
} )
2020-03-13 11:48:45 +01:00
} . attach ( )
2020-03-05 21:07:10 +01:00
}
2020-03-12 23:27:40 +01:00
/ * *
2020-07-26 20:56:01 +02:00
* Launches the given activity and put it as the current one
* @param firstTime to true means the task history will be reset ( as if the app were
* launched anew into this activity )
2020-03-05 22:49:16 +01:00
* /
2020-05-19 09:49:34 +02:00
private fun launchActivity ( activity : AppCompatActivity , firstTime : Boolean = false ) {
2020-03-08 12:54:18 +01:00
val intent = Intent ( this , activity :: class . java )
2020-05-19 09:49:34 +02:00
if ( firstTime ) {
intent . flags = Intent . FLAG _ACTIVITY _NEW _TASK or Intent . FLAG _ACTIVITY _CLEAR _TASK
}
2020-03-08 12:54:18 +01:00
startActivity ( intent )
2020-03-05 22:49:16 +01:00
}
2020-03-12 23:27:40 +01:00
/ * *
2020-07-26 20:56:01 +02:00
* Closes the drawer if it is open , when we press the back button
2020-03-05 21:07:10 +01:00
* /
override fun onBackPressed ( ) {
2021-01-13 01:28:08 +01:00
if ( binding . drawerLayout . isDrawerOpen ( GravityCompat . START ) ) {
binding . drawerLayout . closeDrawer ( GravityCompat . START )
2020-03-05 21:07:10 +01:00
} else {
super . onBackPressed ( )
}
2020-02-28 17:08:54 +01:00
}
2020-03-04 18:04:55 +01:00
As a user I want to be able to see posts in a feed (#28)
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* rebased from master
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* fixed another merge problem
* trying my best to merge
* removed drawable definition in activity_post.xml
* implements swipe motion
add a new class to implement swipe motion
add the swipe right from home page to display settings
passed the homepage in a fragment
* transform profile activity into fragment
transformed profile activity and layout into fragment
linked it with a swipe motion
* Implement swipeable tabs
* Ask for login on first start, add API endpoints, change profile to show the user's profile
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* layout changes
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* Add tests
* delete test for now
* Adapt test to changes (no more profile from drawer)
* Add unit test for api
* Add test for profile, refactor to allow testing, add exception to security policy to allow tests
* Adapt test to new situation
* Fix typo due to change
* refactor somewhat
* added a feed test
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* WIP posts
* trying to add images
* WIP posts
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* WIP posts
* WIP posts
* WIP posts
* WIP posts
* trying to add images
* trying to add images
* trying to add images
* trying to add images
* Got posts working and linked them to the profile
* Got posts working and linked them to the profile
* added tests for Post
* layout changes
* layout changes
* moved a test file
* refactoring
* refactoring
* refactoring
* refactoring
* removed wrong annotation in unit test
* removed an import that was breaking the build
* removed an import that was breaking the build
* removed tests that broke from merge, will override with master
* removed tests that broke from merge, will override with master
* added UI test for the post activity
* fixed merging errors
* trying my best to merge
* removed drawable definition in activity_post.xml
* Started converting Post to a fragment
* got a working feed
* WI
* removed non-valid test
* rebase on other branch
* moved the feed to the home page
* added a feed test
* added a working feed test
* fixed broken test
* merged with master
* added a max height for images and made profile pictures round
* Added a default image for the post
* created a PostActivity to look a single posts
* fixed buggy postActivity
* Complete overhall of the feed UI
* removed test that didn't please Travis
* removed legacy test
* changed feedAdapter init location (outside of network callback)
Co-authored-by: Matthieu <61561059+Wv5twkFEKh54vo4tta9yu7dHa3@users.noreply.github.com>
Co-authored-by: Ulysse Widmer <ulysse.widmer@epfl.ch>
2020-03-16 09:38:35 +01:00
}