This commit is contained in:
erik-everardo 2024-01-14 02:17:27 -06:00
parent b7def58edc
commit 9d8a35a805
12 changed files with 375 additions and 57 deletions

View File

@ -17,6 +17,8 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import coil.load import coil.load
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.isolaatti.BuildConfig import com.isolaatti.BuildConfig
import com.isolaatti.R import com.isolaatti.R
import com.isolaatti.about.AboutActivity import com.isolaatti.about.AboutActivity
@ -50,6 +52,7 @@ import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
import io.noties.markwon.linkify.LinkifyPlugin import io.noties.markwon.linkify.LinkifyPlugin
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.w3c.dom.Text
@AndroidEntryPoint @AndroidEntryPoint
class FeedFragment : Fragment(), OnUserInteractedWithPostCallback { class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
@ -134,10 +137,6 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
viewBinding.homeDrawer.setNavigationItemSelectedListener { viewBinding.homeDrawer.setNavigationItemSelectedListener {
when(it.itemId) { when(it.itemId) {
R.id.my_profile_menu_item -> {
ProfileActivity.startActivity(requireContext(), currentUserId)
true
}
R.id.drafts_menu_item -> { R.id.drafts_menu_item -> {
startActivity(Intent(requireActivity(), DraftsActivity::class.java)) startActivity(Intent(requireActivity(), DraftsActivity::class.java))
true true
@ -194,14 +193,18 @@ class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
val image: ImageView? = header?.findViewById(R.id.profileImageView) val image: ImageView? = header?.findViewById(R.id.profileImageView)
val textViewName: TextView? = header?.findViewById(R.id.textViewName) val textViewName: TextView? = header?.findViewById(R.id.textViewName)
val textViewEmail: TextView? = header?.findViewById(R.id.textViewEmail) val textViewEmail: TextView? = header?.findViewById(R.id.textViewEmail)
val textViewUsername: TextView? = header?.findViewById(R.id.textViewUsername)
image?.load(UrlGen.userProfileImage(it.userId), imageLoader) image?.load(UrlGen.userProfileImage(it.userId), imageLoader)
image?.setOnClickListener {_ ->
//PictureViewerActivity.startActivityWithImages(requireContext(), arrayOf(UrlGen.userProfileImageFullQuality(it.userId))) val card: MaterialCardView? = header?.findViewById(R.id.drawer_header_card)
card?.setOnClickListener {
ProfileActivity.startActivity(requireContext(), currentUserId)
} }
textViewName?.text = it.name textViewName?.text = it.name
textViewEmail?.text = it.email textViewEmail?.text = it.email
textViewUsername?.text = "@${it.uniqueUsername}"
currentUserId = it.userId currentUserId = it.userId
} }

View File

@ -0,0 +1,22 @@
package com.isolaatti.settings.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.isolaatti.databinding.FragmentAccountSettingsBinding
class AccountSettingsFragment : Fragment() {
private lateinit var binding: FragmentAccountSettingsBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentAccountSettingsBinding.inflate(layoutInflater)
return binding.root
}
}

View File

@ -0,0 +1,22 @@
package com.isolaatti.settings.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.isolaatti.databinding.FragmentPrivacySettingsBinding
class PrivacySettingsFragment : Fragment() {
private lateinit var binding: FragmentPrivacySettingsBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentPrivacySettingsBinding.inflate(layoutInflater)
return binding.root
}
}

View File

@ -1,12 +1,38 @@
package com.isolaatti.settings.ui package com.isolaatti.settings.ui
import android.os.Bundle import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat import android.view.LayoutInflater
import com.isolaatti.R import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.isolaatti.databinding.FragmentSettingsBinding
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : Fragment() {
private lateinit var binding: FragmentSettingsBinding
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreateView(
setPreferencesFromResource(R.xml.preferences, rootKey) inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentSettingsBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupListeners()
}
private fun setupListeners() {
binding.toolbar.setNavigationOnClickListener {
requireActivity().finish()
}
binding.goToAccountSettingsButton.setOnClickListener {
findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToAccountSettingsFragment())
}
} }
} }

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16.01,11H4v2h12.01v3L20,12l-3.99,-4z"/>
</vector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/baseline_arrow_back_24"
app:layout_collapseMode="pin"
app:title="@string/settings"/>
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/appBarLayout"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- Account settings -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
style="@style/Widget.Material3.CardView.Filled">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="8dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/profile_image_view"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="16dp"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Avatar"
tools:src="@tools:sample/avatars"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView
android:id="@+id/text_view_display_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:lines="1"
app:layout_constraintTop_toTopOf="@id/profile_image_view"
app:layout_constraintStart_toEndOf="@id/profile_image_view"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="8dp"
android:textSize="18sp"
tools:text="Display Name"/>
<TextView
android:id="@+id/text_view_username"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:lines="1"
app:layout_constraintTop_toBottomOf="@id/text_view_display_name"
app:layout_constraintStart_toEndOf="@id/profile_image_view"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="8dp"
android:textSize="14sp"
tools:text="\@username"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/go_to_account_settings_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go_to_account_settings"
app:icon="@drawable/baseline_arrow_right_alt_24"
app:layout_constraintTop_toBottomOf="@id/profile_image_view"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Feed settings -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:visibility="gone"
tools:visibility="visible"
style="@style/Widget.Material3.CardView.Filled">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="8dp">
<TextView
android:id="@+id/feed_settings_card_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/feed_settings"
android:textSize="18sp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/feed_settings_card_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/feed_settings_card_title"
android:layout_marginHorizontal="16dp"
android:text="@string/feed_settings_card_description"/>
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go_to_feed_settings"
app:icon="@drawable/baseline_arrow_right_alt_24"
app:layout_constraintTop_toBottomOf="@id/feed_settings_card_message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Privacy settings -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:visibility="gone"
tools:visibility="visible"
style="@style/Widget.Material3.CardView.Filled">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="8dp">
<TextView
android:id="@+id/privacy_settings_card_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/privacy_settings"
android:textSize="18sp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/privacy_settings_card_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/privacy_settings_card_title"
android:layout_marginHorizontal="16dp"
android:text="@string/privacy_settings_card_description"/>
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go_to_privacy_settings"
app:icon="@drawable/baseline_arrow_right_alt_24"
app:layout_constraintTop_toBottomOf="@id/privacy_settings_card_message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -3,47 +3,86 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:paddingTop="16dp" android:paddingTop="16dp"
android:paddingBottom="16dp" android:paddingBottom="16dp"
android:background="@color/purple"> android:background="@color/purple">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/profileImageView"
android:layout_width="100dp"
android:layout_height="100dp" <com.google.android.material.card.MaterialCardView
android:layout_marginStart="8dp" android:id="@+id/drawer_header_card"
style="@style/Widget.Material3.CardView.Outlined"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Avatar" app:layout_constraintStart_toStartOf="parent">
tools:srcCompat="@tools:sample/avatars" />
<TextView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/textViewName" android:id="@+id/linearLayout"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent">
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="TextView"
android:textAlignment="textStart"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/profileImageView"
app:layout_constraintTop_toTopOf="@+id/profileImageView"
tools:text="Name" />
<TextView <com.google.android.material.imageview.ShapeableImageView
android:id="@+id/textViewEmail" android:id="@+id/profileImageView"
android:layout_width="0dp" android:layout_width="100dp"
android:layout_height="wrap_content" android:layout_height="100dp"
android:layout_marginStart="8dp" android:layout_marginStart="16dp"
android:text="TextView" android:layout_marginVertical="16dp"
android:textAlignment="textStart" app:layout_constraintBottom_toBottomOf="parent"
android:textColor="@android:color/white" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/profileImageView" app:shapeAppearance="@style/ShapeAppearanceOverlay.Avatar"
app:layout_constraintTop_toBottomOf="@+id/textViewName" /> tools:srcCompat="@tools:sample/avatars" />
<TextView
android:id="@+id/textViewName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textAlignment="textStart"
android:textColor="@android:color/white"
android:textSize="18sp"
app:layout_constraintBottom_toTopOf="@+id/textViewUsername"
app:layout_constraintEnd_toEndOf="@+id/textViewUsername"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/profileImageView"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
android:layout_marginStart="8dp"
tools:text="Name" />
<TextView
android:id="@+id/textViewUsername"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textAlignment="textStart"
android:textColor="@android:color/white"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/textViewEmail"
app:layout_constraintEnd_toEndOf="@+id/textViewEmail"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/profileImageView"
app:layout_constraintTop_toBottomOf="@+id/textViewName"
android:layout_marginStart="8dp"
tools:text="\@username" />
<TextView
android:id="@+id/textViewEmail"
android:layout_width="271dp"
android:layout_height="wrap_content"
android:textAlignment="textStart"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/profileImageView"
app:layout_constraintTop_toBottomOf="@+id/textViewUsername"
android:layout_marginStart="8dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/my_profile_menu_item"
android:icon="@drawable/baseline_person_24"
android:title="My Profile" />
<item <item
android:id="@+id/squads_menu_item" android:id="@+id/squads_menu_item"
android:icon="@drawable/baseline_people_24" android:icon="@drawable/baseline_people_24"
android:title="Squads" /> android:title="@string/squads" />
<item <item
android:id="@+id/drafts_menu_item" android:id="@+id/drafts_menu_item"
android:icon="@drawable/baseline_pending_24" android:icon="@drawable/baseline_pending_24"
android:title="@string/drafts"/> android:title="@string/drafts"/>
<item
android:id="@+id/qr_menu_item"
android:icon="@drawable/baseline_qr_code_24"
android:title="@string/qr_code"/>
<item <item
android:id="@+id/settings_menu_item" android:id="@+id/settings_menu_item"
android:icon="@drawable/baseline_settings_24" android:icon="@drawable/baseline_settings_24"
android:title="Settings" /> android:title="@string/settings" />
<item <item
android:id="@+id/about_menu_item" android:id="@+id/about_menu_item"
android:icon="@drawable/baseline_info_24" android:icon="@drawable/baseline_info_24"

View File

@ -8,15 +8,15 @@
android:id="@+id/settingsFragment" android:id="@+id/settingsFragment"
android:name="com.isolaatti.settings.ui.SettingsFragment" android:name="com.isolaatti.settings.ui.SettingsFragment"
android:label="SettingsFragment" > android:label="SettingsFragment" >
<action
android:id="@+id/action_settingsFragment_to_changePasswordFragment"
app:destination="@id/changePasswordFragment" />
<action
android:id="@+id/action_settingsFragment_to_sessionsFragment"
app:destination="@id/sessionsFragment" />
<action <action
android:id="@+id/action_settingsFragment_to_feedSettingsFragment" android:id="@+id/action_settingsFragment_to_feedSettingsFragment"
app:destination="@id/feedSettingsFragment" /> app:destination="@id/feedSettingsFragment" />
<action
android:id="@+id/action_settingsFragment_to_accountSettingsFragment"
app:destination="@id/accountSettingsFragment" />
<action
android:id="@+id/action_settingsFragment_to_privacySettingsFragment"
app:destination="@id/privacySettingsFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/changePasswordFragment" android:id="@+id/changePasswordFragment"
@ -30,4 +30,19 @@
android:id="@+id/feedSettingsFragment" android:id="@+id/feedSettingsFragment"
android:name="com.isolaatti.settings.ui.FeedSettingsFragment" android:name="com.isolaatti.settings.ui.FeedSettingsFragment"
android:label="FeedSettingsFragment" /> android:label="FeedSettingsFragment" />
<fragment
android:id="@+id/accountSettingsFragment"
android:name="com.isolaatti.settings.ui.AccountSettingsFragment"
android:label="AccountSettingsFragment" >
<action
android:id="@+id/action_accountSettingsFragment_to_changePasswordFragment"
app:destination="@id/changePasswordFragment" />
<action
android:id="@+id/action_accountSettingsFragment_to_sessionsFragment"
app:destination="@id/sessionsFragment" />
</fragment>
<fragment
android:id="@+id/privacySettingsFragment"
android:name="com.isolaatti.settings.ui.PrivacySettingsFragment"
android:label="PrivacySettingsFragment" />
</navigation> </navigation>

View File

@ -137,4 +137,13 @@
<string name="edit_profile">Edit profile</string> <string name="edit_profile">Edit profile</string>
<string name="remove_image_message_confirmation">Remove image? This will not delete your image, but only unset it as profile image</string> <string name="remove_image_message_confirmation">Remove image? This will not delete your image, but only unset it as profile image</string>
<string name="description">Description</string> <string name="description">Description</string>
<string name="go_to_account_settings">Go to account settings</string>
<string name="go_to_feed_settings">Go to feed settings</string>
<string name="feed_settings_card_description">This is the place to take control over what you see on your feed. These settings affect your account, not only this device.</string>
<string name="feed_settings">Feed settings</string>
<string name="go_to_privacy_settings">Go to privacy settings</string>
<string name="privacy_settings">Privacy settings</string>
<string name="privacy_settings_card_description">Set how other people see you on Isolaatti. Hide or show information</string>
<string name="qr_code">QR Code</string>
<string name="squads">Squads</string>
</resources> </resources>