From 663d0e2599d73e88c8f79574c50cf8232fb37e62 Mon Sep 17 00:00:00 2001 From: Wv5twkFEKh54vo4tta9yu7dHa3 <61561059+Wv5twkFEKh54vo4tta9yu7dHa3@users.noreply.github.com> Date: Sun, 3 May 2020 14:30:01 +0200 Subject: [PATCH] Discover feature (#143) * Discover feature * Add refresh handler * Add json to mockserver * singleton mock server, fix null items * Add test to open discover post --- .../java/com/h/pixeldroid/MockedServerTest.kt | 11 +++ .../h/pixeldroid/testUtility/MockServer.kt | 22 ++++- .../java/com/h/pixeldroid/PostActivity.kt | 54 ++++++++++- .../java/com/h/pixeldroid/ProfileActivity.kt | 8 +- .../java/com/h/pixeldroid/api/PixelfedAPI.kt | 31 +++++-- .../fragments/ProfilePostsFragment.kt | 2 +- .../ProfilePostsRecyclerViewAdapter.kt | 9 +- .../fragments/SearchDiscoverFragment.kt | 90 ++++++++++++++++++- .../fragments/feeds/FeedFragment.kt | 2 - .../com/h/pixeldroid/objects/DiscoverPost.kt | 13 +++ .../com/h/pixeldroid/objects/DiscoverPosts.kt | 8 ++ .../java/com/h/pixeldroid/objects/Status.kt | 1 + app/src/main/res/layout/activity_post.xml | 22 ++++- app/src/main/res/layout/fragment_search.xml | 44 ++++++--- 14 files changed, 267 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/com/h/pixeldroid/objects/DiscoverPost.kt create mode 100644 app/src/main/java/com/h/pixeldroid/objects/DiscoverPosts.kt diff --git a/app/src/androidTest/java/com/h/pixeldroid/MockedServerTest.kt b/app/src/androidTest/java/com/h/pixeldroid/MockedServerTest.kt index 63ef7a16..4eb861d1 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/MockedServerTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/MockedServerTest.kt @@ -76,6 +76,17 @@ class MockedServerTest { Thread.sleep(3000) onView(first(withId(R.id.tag_name))).check(matches(withText("#caturday"))) + } + @Test + fun openDiscoverPost(){ + activityScenario.onActivity{ + a -> a.findViewById(R.id.tabs).getTabAt(1)?.select() + } + Thread.sleep(1000) + onView(withId(R.id.discoverList)).perform(click()) + Thread.sleep(1000) + onView(withId(R.id.username)).check(matches(withText("machintuck"))) + } @Test diff --git a/app/src/androidTest/java/com/h/pixeldroid/testUtility/MockServer.kt b/app/src/androidTest/java/com/h/pixeldroid/testUtility/MockServer.kt index bc0bb56c..dc575f18 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/testUtility/MockServer.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/testUtility/MockServer.kt @@ -1,6 +1,5 @@ package com.h.pixeldroid.testUtility -import com.h.pixeldroid.objects.Results import okhttp3.HttpUrl import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse @@ -9,7 +8,10 @@ import okhttp3.mockwebserver.RecordedRequest class MockServer { - private val server = MockWebServer() + + companion object{ + private val server = MockWebServer() + } private val accountJson = "{\n" + " \"id\": \"1450\",\n" + @@ -168,9 +170,15 @@ class MockServer { val searchEmpty = """{"accounts":[],"hashtags":[],"statuses":[]}""" val searchDansupAccounts = """{"accounts":[{"id":"1238","username":"dansup","acct":"dansup@pixelfed.social","display_name":"dansup","locked":false,"followers_count":14,"following_count":0,"statuses_count":0,"note":"Hi, I'm the developer behind Pixelfed!","url":"https:\/\/pixelfed.social\/users\/dansup","avatar":"https:\/\/pixelfed.de\/storage\/avatars\/default.png?v=5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9","website":null,"local":false,"is_admin":false,"created_at":"2019-04-19T01:14:56.000000Z","header_bg":null},{"id":"78120743388450816","username":"dansup","acct":"dansup@mastodon.social","display_name":"dansup\u00ae","locked":false,"followers_count":2,"following_count":0,"statuses_count":1,"note":"

Full stack developer.<\/p>

Creator of @pixelfed<\/span><\/a><\/span>, admin of https:\/\/<\/span>pixelfed.social<\/span><\/span><\/a><\/p>

#music<\/span><\/a> #design<\/span><\/a> #webdev<\/span><\/a> #beer<\/span><\/a><\/p>","url":"https:\/\/mastodon.social\/users\/dansup","avatar":"https:\/\/pixelfed.de\/storage\/avatars\/default.png?v=5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9","website":null,"local":false,"is_admin":false,"created_at":"2019-09-13T13:43:56.000000Z","header_bg":null}],"hashtags":[],"statuses":[]}""" + val discover = """{"posts":[{"type":"photo:album","url":"https:\/\/pixelfed.de\/p\/MarkJR84\/147370947417083904","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/55d75a11bcc79dd8c98cf04e40ea0ea563508f35\/ujO0Zt8JuZLRgN6gP1JtVeIBcVxMQXDBtDAMDBUM_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/ieure\/142862071581773824","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/50fb80d927603c0a90afc2dc4a913d4b73d886e5\/1VaAV0uYoWGQKcJrM5i3F5EJeVriu6doEwLRPyyG_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/kindundkegel\/156147414724644864","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/5ac8092cc03257b7229f67c7c03f83c44e79aa61\/g5MM1vAF2q58vf9fDRVYfseDIC17AeB143HGPJMt_thumb.jpeg"},{"type":"photo:album","url":"https:\/\/pixelfed.de\/p\/die6095\/160363458813104128","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/66864b9ca55ad8d94df956d4042e7080c4767e0c\/IaUxEuNQveOL6BaA2f05KDaVexWwp4Ebr2z5j7P1_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/albert\/140256440240705536","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/832bb8b76564b4e4fdae78637ef71aec8dfc5413\/FPxvwun0CczGJ4vqS3pdPBP2V5nVwfYOdn6OZKwl_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/caffee\/133109637321986048","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/81f8bec749901cf1f57bc5ef516cd3bd837abd9c\/bf4WBOCjRXIfP38pEPVVlekNA7KAmOyagrdbNz9S_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/OBS\/160664565552648192","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/d2fb84479480bba3f8caea6e286af5e68cc96043\/WEEyhhjYfDfUu4JQ0F5LWrrYM1CunD4U8TViqNa8_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/mybujo\/147730903064514560","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/af24fb17907442403d590308ee5728844f9a65fd\/6zaeKPo5GTDHCkRrl6SXSs288HJXcpvo3B0dK8La_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/xtz\/132236940895457280","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/f1114b52fd6acd5f7dd57f99f9c3f8b43bbe6755\/2y5IHLUv8QpGXPGu3OByFw43ixNTjMGr0SSM0IBc_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/miguel31416\/153835062528446464","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/3d238be60342b03e99597acb95f3202ff5e28ecc\/ndZt1Y9HP23vBDidfumz66ePyOtiDzx6PoVMUIh0_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Unterholz\/149623530475098112","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/6718ff240b37ea60056b739cd9d723ff3f4a3182\/u9gU8532aqto5a5KyQbk4kyIvjiYlFYuydJfNCGW_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/eiseskaelte\/137934754728251392","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/6ef83b3e8ff8c33c534c9b6c5f6b9663ec95b7cc\/LtV219DZNDJfksAevobbrGTKPc3OBuA9PUBr6gXr_thumb.png"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/nimu\/144158481107259392","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/41a443fdae82d760bcbf858a3399cd421bc525eb\/oviSIwJ7bIHOxykZY7mUVl0xJ9Tj2abtZRPtCp9W_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/lastscater\/137926547892998144","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/90840e09c38be3ced54a83ea11f89956cb834b26\/HRCYdRziVXDsFw39LIHXrKReCs6YEFFTGnSMEb7e_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/vitorpires\/154891474964713472","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/4e45ce7f71c006f5284f4ffd39cde516fd852faa\/m4zRcA94lUtltjEUKIZtwMBEOQ74a3wMWpEqDM9S_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/cringe\/154235391417913344","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/924bac0d892d54a247213a5cd3e3f5aee4777fd1\/8l4TosvpojPCQbI2NDhaQTuvsfDwTHblRMp2Uf1f_thumb.png"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/lastscater\/137951787188621312","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/90840e09c38be3ced54a83ea11f89956cb834b26\/ds52GM0O7reAsvmGy2NSL2F1KPmNVqZJZTHEr7hI_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/LittleJoeMuc\/134359790792085504","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/c47c50c61d58c6392917640925d171e8b865fee0\/z6kBZxIDcSDkUwGOAGYckqZQc83om684paqYihdO_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/lastscater\/137925095220973568","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/90840e09c38be3ced54a83ea11f89956cb834b26\/QVry7No0BwNmF99FBCaBzFPsilFP4BNBkLvvugew_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/noooaaaiiin\/155404404713984000","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/d4d5c08106389fc548c2aef0d8f3ff7cfa3d3069\/kU0W2rnm7mzqV7q7lo2uLluefiEzILzaYzRbgqgb_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/snaums\/145995392436277248","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/1f0d995ffb7a60c9475ed4e4c0ed25aaddfbde70\/DQf1Y1Dl11twi8cbPU2eKUVjuGk6H1nyPmULJsOz_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Almusanz\/159960015694860288","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/040df869cbb7c9442d5462e2eb5e7ae825ba25d4\/Z0mSqgYI9faLSpYLgcoD7A0Jz1GDCMLDTQfcvNdu_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/eljay\/130011130146983936","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/ce7e035a402debf0fc3232ab682070d5ddc7b5f1\/e7n272XWbTKpYTwdHhJauPhUHWpYfrfEtjo7NPf7_thumb.jpeg"},{"type":"photo:album","url":"https:\/\/pixelfed.de\/p\/plukordinaire\/159325092709535744","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/fd35e6591b0dd4ecc10cd1d1c4c804e0fdeb250b\/dPs70MKL4UZuU2Nwt3nIIcHSp5WyCZQ8PNc3rRiV_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/pixelstreet\/147856947473944576","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/b8d1b7c62c7bf2412a8dcde4a75a9fa1d64a120a\/7K6iVwdF2L9Z7F2SHva9rwfxHiVV0Nrwg0YuPN82_thumb.png"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Skoschi\/157826394389352448","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/17a88b10bc9476951217b4adfa8a60fa07df6689\/2EOZ9Of46bU4JVLJvfLavZL7qBUWndw3UyFV3ads_thumb.jpeg"},{"type":"photo:album","url":"https:\/\/pixelfed.de\/p\/paulakreuzer\/158959344812167168","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/4974892d3110a34dafe15a31cd6826370d90d4b6\/xeEnavra15D6FkG6Gm0ck64yYIQR4Y9CTdk2CcrJ_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/ArcanHell\/161515195255099392","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/2734fafccac3289550956b10b13bd2068fcd76be\/l1ewmXyd2dgrOVCXm0LRtM3MwPR7nd7RPj3eOehu_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/kindundkegel\/153475112908230656","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/5ac8092cc03257b7229f67c7c03f83c44e79aa61\/ODZil754pGMVBpiCCVHgxySCrBtb6umeENWjTJGO_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Almusanz\/159953937712156672","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/040df869cbb7c9442d5462e2eb5e7ae825ba25d4\/KYtbVJ5Ms5OTxzL2tIKiuK9r75ZA7yKdxP9TgOyj_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/KC_Heine\/160060046221381632","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/29940ae2a397610159094385e0bb538f2710a1fe\/r7eUVmGLAYxzclAcmWNZyqudbwEhrgheEIyW3EBy_thumb.jpeg"},{"type":"photo:album","url":"https:\/\/pixelfed.de\/p\/ArcanHell\/161871256575152128","thumb":"https:\/\/pixelfed.de\/storage\/m\/d6eeff88aa0c9af7fd5f87cd6431a14d929d049b\/2734fafccac3289550956b10b13bd2068fcd76be\/mVX4GI2piQiLYKVj2g6zIUKDqw6AKwnFqJhH6uuJ_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Spaziergaenger\/132029081461067776","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/d75e944e8cc85b953d37d1a9d615f44d6e0cca22\/HFzlgWRwwhxjQhUJsYYf7uWXSeb4RXhHlo0diZlN_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/ambratolm\/139802175395205120","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/27fcf21acabf918e928e1c7735b37c5ae31b0a7f\/02zt6B4hzfTRiTJ580V0NhBnqydCmzrkdvMuOD5F_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Spaziergaenger\/161138718869164032","thumb":"https:\/\/pixelfed.de\/storage\/m\/d0931bf747b992a1c83e055753526516f2706111\/d75e944e8cc85b953d37d1a9d615f44d6e0cca22\/1ooyRfacILwBUX0iXb1cylr6Z6ZQxG2yc8sLHvSs_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Hogan\/135357604443590656","thumb":"https:\/\/pixelfed.de\/storage\/m\/8fa1fd56cb1e6ebed8a4959ce89bd19543a4da5f\/c57656ac5a0c325a42f74916663cee33dca42475\/mqBjO74MM0mlFrRhtXKhg5X58hFaWGviqknnvXzq_thumb.jpeg"},{"type":"photo","url":"https:\/\/pixelfed.de\/p\/Mediokerl\/150314218074279936","thumb":"https:\/\/pixelfed.de\/storage\/m\/113a3e2124a33b1f5511e531953f5ee48456e0c7\/fbdb3b050807225b57b4b782c539bf7d2dd0ef23\/GAxpGSe1RKfQw7jSumE7jzetByfY2Kzer04UOgOU_thumb.jpeg"}]}""" + fun start() { - server.dispatcher = getDispatcher() - server.start() + try { + server.dispatcher = getDispatcher() + server.start() + } catch (e: IllegalArgumentException) { + + } } private fun getDispatcher(): Dispatcher { @@ -335,6 +343,12 @@ class MockServer { "application/json; charset=utf-8" ).setResponseCode(200).setBody(searchEmpty) } + request.path?.startsWith("/api/v2/discover/posts")!! -> { + return MockResponse().addHeader( + "Content-Type", + "application/json; charset=utf-8" + ).setResponseCode(200).setBody(discover) + } else -> return MockResponse().setResponseCode(404) } } diff --git a/app/src/main/java/com/h/pixeldroid/PostActivity.kt b/app/src/main/java/com/h/pixeldroid/PostActivity.kt index 983897f0..d4438617 100644 --- a/app/src/main/java/com/h/pixeldroid/PostActivity.kt +++ b/app/src/main/java/com/h/pixeldroid/PostActivity.kt @@ -1,14 +1,25 @@ package com.h.pixeldroid import android.content.Context +import android.content.SharedPreferences import android.os.Bundle +import android.util.Log +import android.view.View import androidx.appcompat.app.AppCompatActivity +import com.h.pixeldroid.api.PixelfedAPI 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 kotlinx.android.synthetic.main.activity_post.* +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response class PostActivity : AppCompatActivity() { + private lateinit var preferences: SharedPreferences lateinit var postFragment : PostFragment lateinit var domain : String @@ -17,18 +28,53 @@ class PostActivity : AppCompatActivity() { setContentView(R.layout.activity_post) val status = intent.getSerializableExtra(POST_TAG) as Status? + val discoverPost: DiscoverPost? = intent.getSerializableExtra(DISCOVER_TAG) as DiscoverPost? - domain = getSharedPreferences( + preferences = getSharedPreferences( "${BuildConfig.APPLICATION_ID}.pref", Context.MODE_PRIVATE - ).getString("domain", "")!! + ) + domain = preferences.getString("domain", "")!! postFragment = PostFragment() val arguments = Bundle() - arguments.putSerializable(POST_TAG, status) arguments.putString(DOMAIN_TAG, domain) - postFragment.arguments = arguments + if (discoverPost != null) { + postProgressBar.visibility = View.VISIBLE + getDiscoverPost(arguments, discoverPost) + } else { + initializeFragment(arguments, status) + } + } + + private fun getDiscoverPost( + arguments: Bundle, + discoverPost: DiscoverPost + ) { + val api = PixelfedAPI.create(domain) + val accessToken = preferences.getString("accessToken", "") ?: "" + val id = discoverPost.url?.substringAfterLast('/') ?: "" + api.getStatus("Bearer $accessToken", id).enqueue(object : Callback { + + override fun onFailure(call: Call, t: Throwable) { + Log.e("PostActivity:", t.toString()) + } + + override fun onResponse(call: Call, response: Response) { + if(response.code() == 200) { + val status = response.body()!! + postProgressBar.visibility = View.GONE + initializeFragment(arguments, status) + } + } + }) + } + + private fun initializeFragment(arguments: Bundle, status: Status?){ + arguments.putSerializable(POST_TAG, status) + postFragment.arguments = arguments supportFragmentManager.beginTransaction() .add(R.id.postFragmentSingle, postFragment).commit() + postFragmentSingle.visibility = View.VISIBLE } } diff --git a/app/src/main/java/com/h/pixeldroid/ProfileActivity.kt b/app/src/main/java/com/h/pixeldroid/ProfileActivity.kt index 0ab69d15..46f247d3 100644 --- a/app/src/main/java/com/h/pixeldroid/ProfileActivity.kt +++ b/app/src/main/java/com/h/pixeldroid/ProfileActivity.kt @@ -47,7 +47,7 @@ class ProfileActivity : AppCompatActivity() { // Set posts RecyclerView as a grid with 3 columns recycler = findViewById(R.id.profilePostsRecyclerView) recycler.layoutManager = GridLayoutManager(applicationContext, 3) - adapter = ProfilePostsRecyclerViewAdapter(this) + adapter = ProfilePostsRecyclerViewAdapter() recycler.adapter = adapter setContent() @@ -131,12 +131,8 @@ class ProfileActivity : AppCompatActivity() { override fun onResponse(call: Call>, response: Response>) { if(response.code() == 200) { - val posts = ArrayList() val statuses = response.body()!! - for(status in statuses) { - posts.add(status) - } - adapter.addPosts(posts) + adapter.addPosts(statuses) } } }) diff --git a/app/src/main/java/com/h/pixeldroid/api/PixelfedAPI.kt b/app/src/main/java/com/h/pixeldroid/api/PixelfedAPI.kt index 2e7b6f34..27ae9874 100644 --- a/app/src/main/java/com/h/pixeldroid/api/PixelfedAPI.kt +++ b/app/src/main/java/com/h/pixeldroid/api/PixelfedAPI.kt @@ -18,6 +18,17 @@ import retrofit2.http.Field interface PixelfedAPI { + companion object { + fun create(baseUrl: String): PixelfedAPI { + return Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build().create(PixelfedAPI::class.java) + } + } + + @FormUrlEncoded @POST("/api/v1/apps") fun registerApplication( @@ -210,15 +221,11 @@ interface PixelfedAPI { @Path("id") accountId : String ): Call - companion object { - fun create(baseUrl: String): PixelfedAPI { - return Retrofit.Builder() - .baseUrl(baseUrl) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .build().create(PixelfedAPI::class.java) - } - } + @GET("/api/v1/statuses/{id}") + fun getStatus( + @Header("Authorization") authorization: String, + @Path("id") accountId : String + ): Call @Multipart @POST("/api/v1/media") @@ -231,5 +238,11 @@ interface PixelfedAPI { // get instance configuration @GET("/api/v1/instance") fun instance() : Call + + // get discover + @GET("/api/v2/discover/posts") + fun discover( + @Header("Authorization") authorization: String + ) : Call } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsFragment.kt index e90a8d92..c44449bb 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsFragment.kt @@ -45,7 +45,7 @@ class ProfilePostsFragment : Fragment() { columnCount <= 1 -> LinearLayoutManager(context) else -> GridLayoutManager(context, columnCount) } - adapter = ProfilePostsRecyclerViewAdapter(requireContext()) + adapter = ProfilePostsRecyclerViewAdapter() } } return view diff --git a/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsRecyclerViewAdapter.kt b/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsRecyclerViewAdapter.kt index d591386b..a41c731f 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsRecyclerViewAdapter.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/ProfilePostsRecyclerViewAdapter.kt @@ -1,6 +1,5 @@ package com.h.pixeldroid.fragments -import android.content.Context import android.content.Intent import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater @@ -16,9 +15,7 @@ import com.h.pixeldroid.utils.ImageConverter.Companion.setSquareImageFromURL * [RecyclerView.Adapter] that can display a list of [PostMiniature]s and makes a call to the * specified [OnListFragmentInteractionListener]. */ -class ProfilePostsRecyclerViewAdapter( - private val context: Context -) : RecyclerView.Adapter() { +class ProfilePostsRecyclerViewAdapter: RecyclerView.Adapter() { private val posts: ArrayList = ArrayList() fun addPosts(newPosts : List) { @@ -37,9 +34,9 @@ class ProfilePostsRecyclerViewAdapter( val post = posts[position] setSquareImageFromURL(holder.postView, post.getPostPreviewURL(), holder.postPreview) holder.postPreview.setOnClickListener { - val intent = Intent(context, PostActivity::class.java) + val intent = Intent(holder.postPreview.context, PostActivity::class.java) intent.putExtra(Status.POST_TAG, post) - context.startActivity(intent) + holder.postPreview.context.startActivity(intent) } } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt index 7a6328dc..922974ae 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt @@ -4,25 +4,44 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.EditText +import android.widget.ImageView +import android.widget.ProgressBar import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.h.pixeldroid.BuildConfig +import com.h.pixeldroid.PostActivity import com.h.pixeldroid.R import com.h.pixeldroid.SearchActivity import com.h.pixeldroid.api.PixelfedAPI +import com.h.pixeldroid.objects.DiscoverPost +import com.h.pixeldroid.objects.DiscoverPosts +import com.h.pixeldroid.objects.Status +import com.h.pixeldroid.utils.ImageConverter +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response /** - * This fragment lets you search and use PixelFed's Discover feature + * This fragment lets you search and use Pixelfed's Discover feature */ class SearchDiscoverFragment : Fragment() { - lateinit var api: PixelfedAPI + private lateinit var api: PixelfedAPI private lateinit var preferences: SharedPreferences + private lateinit var recycler : RecyclerView + private lateinit var adapter : DiscoverRecyclerViewAdapter private lateinit var accessToken: String + private lateinit var discoverProgressBar: ProgressBar + private lateinit var discoverRefreshLayout: SwipeRefreshLayout + override fun onCreateView( @@ -37,6 +56,11 @@ class SearchDiscoverFragment : Fragment() { intent.putExtra("searchFeed", search.text.toString()) startActivity(intent) } + // Set posts RecyclerView as a grid with 3 columns + recycler = view.findViewById(R.id.discoverList) + recycler.layoutManager = GridLayoutManager(requireContext(), 3) + adapter = DiscoverRecyclerViewAdapter() + recycler.adapter = adapter return view } @@ -49,5 +73,67 @@ class SearchDiscoverFragment : Fragment() { api = PixelfedAPI.create("${preferences.getString("domain", "")}") accessToken = preferences.getString("accessToken", "") ?: "" + discoverProgressBar = view.findViewById(R.id.discoverProgressBar) + discoverRefreshLayout = view.findViewById(R.id.discoverRefreshLayout) + + getDiscover() + + discoverRefreshLayout.setOnRefreshListener { + getDiscover() + } + } + + private fun getDiscover() { + + api.discover("Bearer $accessToken") + .enqueue(object : Callback { + + override fun onFailure(call: Call, t: Throwable) { + Log.e("SearchDiscoverFragment:", t.toString()) + } + + override fun onResponse(call: Call, response: Response) { + if(response.code() == 200) { + val discoverPosts = response.body()!! + adapter.addPosts(discoverPosts.posts) + discoverProgressBar.visibility = View.GONE + discoverRefreshLayout.isRefreshing = false + } + } + }) + } + /** + * [RecyclerView.Adapter] that can display a list of [DiscoverPost]s + */ + class DiscoverRecyclerViewAdapter: RecyclerView.Adapter() { + private val posts: ArrayList = ArrayList() + + fun addPosts(newPosts : List) { + posts.clear() + posts.addAll(newPosts) + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.fragment_profile_posts, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val post = posts[position] + ImageConverter.setSquareImageFromURL(holder.postView, post.thumb, holder.postPreview) + holder.postPreview.setOnClickListener { + val intent = Intent(holder.postView.context, PostActivity::class.java) + intent.putExtra(Status.DISCOVER_TAG, post) + holder.postView.context.startActivity(intent) + } + } + + override fun getItemCount(): Int = posts.size + + inner class ViewHolder(val postView: View) : RecyclerView.ViewHolder(postView) { + val postPreview: ImageView = postView.findViewById(R.id.postPreview) + } } } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt index bb3f42da..fbe75e09 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt @@ -20,12 +20,10 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.bumptech.glide.ListPreloader.PreloadModelProvider import com.h.pixeldroid.BuildConfig import com.h.pixeldroid.R import com.h.pixeldroid.api.PixelfedAPI import com.h.pixeldroid.objects.FeedContent -import com.h.pixeldroid.objects.Status import kotlinx.android.synthetic.main.fragment_feed.view.* import retrofit2.Call import retrofit2.Callback diff --git a/app/src/main/java/com/h/pixeldroid/objects/DiscoverPost.kt b/app/src/main/java/com/h/pixeldroid/objects/DiscoverPost.kt new file mode 100644 index 00000000..e681c69c --- /dev/null +++ b/app/src/main/java/com/h/pixeldroid/objects/DiscoverPost.kt @@ -0,0 +1,13 @@ +package com.h.pixeldroid.objects + +import java.io.Serializable + +/* +NOT DOCUMENTED, USE WITH CAUTION + */ + +data class DiscoverPost( + val type: String?, //This is probably an enum, with these values: https://github.com/pixelfed/pixelfed/blob/700c7805cecc364b68b9cfe20df00608e0f6c465/app/Status.php#L31 + val url: String?, //URL to post + val thumb: String? //URL to thumbnail +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/h/pixeldroid/objects/DiscoverPosts.kt b/app/src/main/java/com/h/pixeldroid/objects/DiscoverPosts.kt new file mode 100644 index 00000000..e324cb85 --- /dev/null +++ b/app/src/main/java/com/h/pixeldroid/objects/DiscoverPosts.kt @@ -0,0 +1,8 @@ +package com.h.pixeldroid.objects + +import java.io.Serializable + +data class DiscoverPosts( + //Required attributes + val posts: List +) : Serializable diff --git a/app/src/main/java/com/h/pixeldroid/objects/Status.kt b/app/src/main/java/com/h/pixeldroid/objects/Status.kt index 2d40b7d6..2fa29d2d 100644 --- a/app/src/main/java/com/h/pixeldroid/objects/Status.kt +++ b/app/src/main/java/com/h/pixeldroid/objects/Status.kt @@ -94,6 +94,7 @@ data class Status( const val POST_TAG = "postTag" const val POST_FRAG_TAG = "postFragTag" const val DOMAIN_TAG = "domainTag" + const val DISCOVER_TAG = "discoverTag" } fun getPostUrl() : String? = media_attachments?.getOrNull(0)?.url diff --git a/app/src/main/res/layout/activity_post.xml b/app/src/main/res/layout/activity_post.xml index 1553fe96..ae3d6792 100644 --- a/app/src/main/res/layout/activity_post.xml +++ b/app/src/main/res/layout/activity_post.xml @@ -6,12 +6,26 @@ android:layout_height="match_parent" tools:context=".PostActivity"> - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 0d942c2c..e11cfbbb 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -16,7 +16,7 @@ app:errorEnabled="true" app:layout_constraintEnd_toStartOf="@+id/searchButton" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" > + app:layout_constraintTop_toTopOf="parent"> - -