@@ -25,6 +25,7 @@ import android.view.View
2525import android.widget.FrameLayout
2626import android.widget.ImageView
2727import android.widget.ScrollView
28+ import android.widget.Toast
2829import androidx.appcompat.app.AppCompatActivity
2930import androidx.appcompat.widget.AppCompatImageView
3031import com.google.android.material.card.MaterialCardView
@@ -54,8 +55,11 @@ import org.quantumbadger.redreader.common.time.TimestampUTC.Companion.now
5455import org.quantumbadger.redreader.reddit.APIResponseHandler.ActionResponseHandler
5556import org.quantumbadger.redreader.reddit.APIResponseHandler.UserResponseHandler
5657import org.quantumbadger.redreader.reddit.RedditAPI
57- import org.quantumbadger.redreader.reddit.api.RedditOAuth.completeLogin
58+ import org.quantumbadger.redreader.reddit.api.RedditSubredditSubscriptionManager
59+ import org.quantumbadger.redreader.reddit.api.SubredditSubscriptionState
60+ import org.quantumbadger.redreader.reddit.things.InvalidSubredditNameException
5861import org.quantumbadger.redreader.reddit.things.RedditUser
62+ import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId
5963import org.quantumbadger.redreader.reddit.url.UserPostListingURL
6064import org.quantumbadger.redreader.views.LoadingSpinnerView
6165import org.quantumbadger.redreader.views.liststatus.ErrorView
@@ -94,6 +98,9 @@ object UserProfileDialog {
9498 val chipMoreInfo = dialog.findViewById<Chip >(R .id.user_profile_chip_more_info)!!
9599 val chipBlock = dialog.findViewById<Chip >(R .id.user_profile_chip_block)!!
96100 val chipUnblock = dialog.findViewById<Chip >(R .id.user_profile_chip_unblock)!!
101+ val chipFollow = dialog.findViewById<Chip >(R .id.user_profile_chip_follow)!!
102+ val chipFollowed = dialog.findViewById<Chip >(R .id.user_profile_chip_followed)!!
103+ val chipUnfollow = dialog.findViewById<Chip >(R .id.user_profile_chip_unfollow)!!
97104
98105 val cm = CacheManager .getInstance(activity)
99106 val accountManager = RedditAccountManager .getInstance(activity)
@@ -170,6 +177,19 @@ object UserProfileDialog {
170177 chipGold.visibility = View .GONE
171178 }
172179
180+ val usernameToSubreddit = " u_" + username
181+ val userSubredditCanonicalId = SubredditCanonicalId (usernameToSubreddit)
182+ if ((getSubMan(activity).getSubscriptionState(userSubredditCanonicalId)
183+ == SubredditSubscriptionState .NOT_SUBSCRIBED )
184+ ) {
185+ chipFollowed.visibility = View .GONE
186+ chipFollow.visibility = View .VISIBLE
187+ chipUnfollow.visibility = View .GONE
188+ }else {
189+ chipFollow.visibility = View .GONE
190+ chipUnfollow.visibility = View .VISIBLE
191+ }
192+
173193 if (PrefsUtility .appearance_user_show_avatars()) {
174194 val iconUrl = user.iconUrl
175195 if (iconUrl?.value?.isNotEmpty() == true ) {
@@ -258,6 +278,12 @@ object UserProfileDialog {
258278 chipUnblock.isEnabled = false // grey out
259279 unblockUser(activity, username, chipBlock, chipBlocked, chipUnblock)
260280 }
281+ chipFollow.setOnClickListener {
282+ subscribeToUser(activity, username)
283+ }
284+ chipUnfollow.setOnClickListener {
285+ unsubscribeToUser(activity, username)
286+ }
261287 }
262288 }
263289
@@ -282,6 +308,70 @@ object UserProfileDialog {
282308 )
283309 }
284310
311+ private fun subscribeToUser (activity : AppCompatActivity , username : String ) {
312+ try {
313+ // Every user has a user-subreddit that you can follow
314+ val usernameToSubreddit = " u_" + username // subreddit of spez is u_spez
315+ val userSubredditCanonicalId = SubredditCanonicalId (usernameToSubreddit)
316+
317+ val subMan = getSubMan(activity)
318+ if ((subMan.getSubscriptionState(userSubredditCanonicalId)
319+ == SubredditSubscriptionState .NOT_SUBSCRIBED )
320+ ) {
321+ subMan.subscribe(userSubredditCanonicalId, activity)
322+ Toast .makeText(
323+ activity,
324+ R .string.userprofile_toast_follow_loading,
325+ Toast .LENGTH_SHORT
326+ ).show()
327+ } else {
328+ Toast .makeText(
329+ activity,
330+ R .string.userprofile_toast_followed,
331+ Toast .LENGTH_SHORT
332+ ).show()
333+ }
334+ } catch (e: InvalidSubredditNameException ) {
335+ throw RuntimeException (e)
336+ }
337+ }
338+
339+ private fun unsubscribeToUser (activity : AppCompatActivity , username : String ) {
340+ try {
341+ // Every user has a user-subreddit that you can follow
342+ val usernameToSubreddit = " u_" + username // subreddit of spez is u_spez
343+ val userSubredditCanonicalId = SubredditCanonicalId (usernameToSubreddit)
344+
345+ val subMan = getSubMan(activity)
346+ if ((subMan.getSubscriptionState(userSubredditCanonicalId)
347+ == SubredditSubscriptionState .SUBSCRIBED )
348+ ) {
349+ subMan.unsubscribe(userSubredditCanonicalId, activity)
350+ Toast .makeText(
351+ activity,
352+ R .string.userprofile_toast_unfollow_loading,
353+ Toast .LENGTH_SHORT
354+ ).show()
355+ } else {
356+ Toast .makeText(
357+ activity,
358+ R .string.userprofile_toast_not_following,
359+ Toast .LENGTH_SHORT
360+ ).show()
361+ }
362+ } catch (e: InvalidSubredditNameException ) {
363+ throw RuntimeException (e)
364+ }
365+ }
366+
367+ private fun getSubMan (activity : AppCompatActivity ): RedditSubredditSubscriptionManager {
368+ val subMan = RedditSubredditSubscriptionManager .getSingleton(
369+ activity,
370+ RedditAccountManager .getInstance(activity).defaultAccount
371+ )
372+ return subMan
373+ }
374+
285375 private fun unblockUser (activity : AppCompatActivity , username : String , chipBlock : Chip , chipBlocked : Chip , chipUnblock : Chip ) {
286376 val cm = CacheManager .getInstance(activity)
287377 val currentUser = RedditAccountManager .getInstance(activity).defaultAccount
0 commit comments