Skip to content

Commit 9816dd3

Browse files
authored
Merge pull request #147 from pravinyo/fix_setting_screen_bug
Fix setting screen bug
2 parents baab248 + 2909e0f commit 9816dd3

File tree

5 files changed

+221
-109
lines changed

5 files changed

+221
-109
lines changed
Lines changed: 35 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,54 @@
11
package com.allsoftdroid.audiobook.feature_settings
22

3-
import android.content.Intent
4-
import android.net.Uri
5-
import android.os.Build
63
import android.os.Bundle
7-
import androidx.preference.Preference
8-
import androidx.preference.PreferenceFragmentCompat
9-
import com.allsoftdroid.audiobook.feature_settings.model.Feedback
10-
import com.allsoftdroid.common.base.extension.Event
11-
import com.allsoftdroid.common.base.network.ArchiveUtils
12-
import com.allsoftdroid.common.base.store.userAction.OpenLicensesUI
13-
import com.allsoftdroid.common.base.store.userAction.UserActionEventStore
14-
import com.allsoftdroid.common.base.utils.SettingsPreferenceUtils
15-
import org.koin.core.KoinComponent
16-
import org.koin.core.inject
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.activity.OnBackPressedCallback
8+
import com.allsoftdroid.audiobook.feature_settings.databinding.LayoutSettingsFragmentBinding
9+
import com.allsoftdroid.common.base.fragment.BaseUIFragment
1710

11+
class SettingsFragment : BaseUIFragment() {
1812

19-
class SettingsFragment : PreferenceFragmentCompat(), KoinComponent {
20-
21-
private val userActionEventStore:UserActionEventStore by inject()
22-
23-
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
24-
setPreferencesFromResource(R.xml.settings_preferences,rootKey)
25-
26-
setupDownloadPref()
27-
setupAboutPref()
28-
setupMiscellaneousPref()
29-
}
30-
31-
private fun setupAboutPref() {
32-
activity?.let {
33-
val privacyPref = findPreference<Preference>(SettingsPreferenceUtils.PRIVACY_POLICY)
34-
35-
privacyPref?.summary = getString(R.string.privacy_summary)
36-
privacyPref?.setOnPreferenceClickListener {
37-
openPrivacyPageOnBrowser()
38-
return@setOnPreferenceClickListener true
39-
}
40-
41-
val feedbackPref = findPreference<Preference>(SettingsPreferenceUtils.FEEDBACK_KEY)
42-
43-
feedbackPref?.summary = getString(R.string.feedback_summary)
44-
feedbackPref?.setOnPreferenceClickListener {
45-
emailFeedback()
46-
return@setOnPreferenceClickListener true
47-
}
48-
}
13+
companion object{
14+
private const val SETTINGS_FRAGMENT = "Settings_fragment"
4915
}
5016

51-
private fun emailFeedback() {
52-
val fragmentManager = childFragmentManager
17+
override fun onCreateView(
18+
inflater: LayoutInflater,
19+
container: ViewGroup?,
20+
savedInstanceState: Bundle?
21+
): View? {
22+
val dataBinding:LayoutSettingsFragmentBinding = inflateLayout(inflater,
23+
R.layout.layout_settings_fragment,container,false)
5324

54-
val oldFeedbackFragment = fragmentManager.findFragmentByTag(getString(R.string.feedback_fragment_tag_label))
25+
dataBinding.lifecycleOwner = viewLifecycleOwner
5526

56-
oldFeedbackFragment?.let {
57-
fragmentManager.beginTransaction().remove(oldFeedbackFragment).commit()
27+
dataBinding.toolbarBackButton.setOnClickListener {
28+
onBackPressed()
5829
}
5930

60-
val feedbackFragment = FeedbackFragment(
61-
context = this,
62-
feedbackListener = object : FeedbackFragment.FeedbackListener{
63-
override fun onFinishUserFeedback(data: Feedback?) {
64-
data?.let {
65-
val manufacturer = Build.MANUFACTURER
66-
val model = Build.MODEL
67-
val version = Build.VERSION.SDK_INT
68-
val versionRelease = Build.VERSION.RELEASE
69-
70-
val bodyBuilder:StringBuilder = StringBuilder()
31+
loadSettingsUI()
7132

72-
bodyBuilder.apply {
73-
append(it.body)
74-
append("\n\n-----------------------------------------------------------------\n")
75-
append("\nUser Device Details:\n")
76-
append("\nManufacturer: $manufacturer")
77-
append("\nModel: $model")
78-
append("\nDevice OS:$version/$versionRelease")
79-
append("\nApp Version:${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE})")
80-
}
81-
82-
val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
83-
this.data = Uri.parse("mailto:")
84-
putExtra(Intent.EXTRA_EMAIL,getString(R.string.developer_mail))
85-
putExtra(Intent.EXTRA_SUBJECT,it.title)
86-
putExtra(Intent.EXTRA_TEXT,bodyBuilder.toString())
87-
}
88-
89-
startActivity(Intent.createChooser(emailIntent,getString(R.string.intent_chooser_send_mail_label)))
90-
}
91-
}
92-
}
93-
)
94-
95-
feedbackFragment.show(fragmentManager,getString(R.string.feedback_fragment_tag_label))
96-
}
97-
98-
private fun openPrivacyPageOnBrowser() {
99-
val uri = Uri.parse(getString(R.string.privacy_page_url))
100-
val intent = Intent(Intent.ACTION_VIEW,uri)
101-
startActivity(Intent.createChooser(intent,"Open URL with"))
33+
return dataBinding.root
10234
}
10335

104-
private fun setupMiscellaneousPref() {
105-
activity?.let {
106-
val licensePref = findPreference<Preference>(SettingsPreferenceUtils.LICENSES_KEY)
107-
108-
licensePref?.summary = getString(R.string.licenses_summary)
109-
licensePref?.setOnPreferenceClickListener {
110-
userActionEventStore.publish(Event(OpenLicensesUI(this::class.java.simpleName)))
111-
return@setOnPreferenceClickListener true
112-
}
113-
114-
val versionPref = findPreference<Preference>(SettingsPreferenceUtils.VERSION_KEY)
115-
versionPref?.summary = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
36+
private fun loadSettingsUI() {
37+
val fragment = childFragmentManager.findFragmentByTag(SETTINGS_FRAGMENT)
38+
39+
if(fragment == null){
40+
childFragmentManager.beginTransaction()
41+
.add(R.id.fragment_container,SettingsPreferenceFragment(), SETTINGS_FRAGMENT)
42+
.commit()
43+
}else{
44+
childFragmentManager.beginTransaction()
45+
.show(fragment)
46+
.commit()
11647
}
11748
}
11849

119-
private fun setupDownloadPref() {
120-
activity?.let {
121-
val downloadPref = findPreference<Preference>(SettingsPreferenceUtils.DOWNLOADS_KEY)
122-
val path = ArchiveUtils.getDownloadsRootFolder(it.application)
123-
124-
val folder = "/$path/${ArchiveUtils.AppFolderName}/"
125-
downloadPref?.summary = folder
126-
}
50+
override fun handleBackPressEvent(callback: OnBackPressedCallback) {
51+
callback.isEnabled = false
52+
requireActivity().onBackPressed()
12753
}
12854
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package com.allsoftdroid.audiobook.feature_settings
2+
3+
import android.content.Intent
4+
import android.net.Uri
5+
import android.os.Build
6+
import android.os.Bundle
7+
import androidx.preference.Preference
8+
import androidx.preference.PreferenceFragmentCompat
9+
import com.allsoftdroid.audiobook.feature_settings.model.Feedback
10+
import com.allsoftdroid.common.base.extension.Event
11+
import com.allsoftdroid.common.base.network.ArchiveUtils
12+
import com.allsoftdroid.common.base.store.userAction.OpenLicensesUI
13+
import com.allsoftdroid.common.base.store.userAction.UserActionEventStore
14+
import com.allsoftdroid.common.base.utils.SettingsPreferenceUtils
15+
import org.koin.core.KoinComponent
16+
import org.koin.core.inject
17+
18+
19+
class SettingsPreferenceFragment : PreferenceFragmentCompat(), KoinComponent {
20+
21+
private val userActionEventStore:UserActionEventStore by inject()
22+
23+
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
24+
setPreferencesFromResource(R.xml.settings_preferences,rootKey)
25+
26+
setupDownloadPref()
27+
setupAboutPref()
28+
setupMiscellaneousPref()
29+
}
30+
31+
private fun setupAboutPref() {
32+
activity?.let {
33+
val privacyPref = findPreference<Preference>(SettingsPreferenceUtils.PRIVACY_POLICY)
34+
35+
privacyPref?.summary = getString(R.string.privacy_summary)
36+
privacyPref?.setOnPreferenceClickListener {
37+
openPrivacyPageOnBrowser()
38+
return@setOnPreferenceClickListener true
39+
}
40+
41+
val feedbackPref = findPreference<Preference>(SettingsPreferenceUtils.FEEDBACK_KEY)
42+
43+
feedbackPref?.summary = getString(R.string.feedback_summary)
44+
feedbackPref?.setOnPreferenceClickListener {
45+
emailFeedback()
46+
return@setOnPreferenceClickListener true
47+
}
48+
}
49+
}
50+
51+
private fun emailFeedback() {
52+
val fragmentManager = childFragmentManager
53+
54+
val oldFeedbackFragment = fragmentManager.findFragmentByTag(getString(R.string.feedback_fragment_tag_label))
55+
56+
oldFeedbackFragment?.let {
57+
fragmentManager.beginTransaction().remove(oldFeedbackFragment).commit()
58+
}
59+
60+
val feedbackFragment = FeedbackFragment(
61+
context = this,
62+
feedbackListener = object : FeedbackFragment.FeedbackListener{
63+
override fun onFinishUserFeedback(data: Feedback?) {
64+
data?.let {
65+
val manufacturer = Build.MANUFACTURER
66+
val model = Build.MODEL
67+
val version = Build.VERSION.SDK_INT
68+
val versionRelease = Build.VERSION.RELEASE
69+
70+
val bodyBuilder:StringBuilder = StringBuilder()
71+
72+
bodyBuilder.apply {
73+
append(it.body)
74+
append("\n\n-----------------------------------------------------------------\n")
75+
append("\nUser Device Details:\n")
76+
append("\nManufacturer: $manufacturer")
77+
append("\nModel: $model")
78+
append("\nDevice OS:$version/$versionRelease")
79+
append("\nApp Version:${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE})")
80+
}
81+
82+
val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
83+
this.data = Uri.parse("mailto:")
84+
putExtra(Intent.EXTRA_EMAIL,getString(R.string.developer_mail))
85+
putExtra(Intent.EXTRA_SUBJECT,it.title)
86+
putExtra(Intent.EXTRA_TEXT,bodyBuilder.toString())
87+
}
88+
89+
startActivity(Intent.createChooser(emailIntent,getString(R.string.intent_chooser_send_mail_label)))
90+
}
91+
}
92+
}
93+
)
94+
95+
feedbackFragment.show(fragmentManager,getString(R.string.feedback_fragment_tag_label))
96+
}
97+
98+
private fun openPrivacyPageOnBrowser() {
99+
val uri = Uri.parse(getString(R.string.privacy_page_url))
100+
val intent = Intent(Intent.ACTION_VIEW,uri)
101+
startActivity(Intent.createChooser(intent,"Open URL with"))
102+
}
103+
104+
private fun setupMiscellaneousPref() {
105+
activity?.let {
106+
val licensePref = findPreference<Preference>(SettingsPreferenceUtils.LICENSES_KEY)
107+
108+
licensePref?.summary = getString(R.string.licenses_summary)
109+
licensePref?.setOnPreferenceClickListener {
110+
userActionEventStore.publish(Event(OpenLicensesUI(this::class.java.simpleName)))
111+
return@setOnPreferenceClickListener true
112+
}
113+
114+
val versionPref = findPreference<Preference>(SettingsPreferenceUtils.VERSION_KEY)
115+
versionPref?.summary = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
116+
}
117+
}
118+
119+
private fun setupDownloadPref() {
120+
activity?.let {
121+
val downloadPref = findPreference<Preference>(SettingsPreferenceUtils.DOWNLOADS_KEY)
122+
val path = ArchiveUtils.getDownloadsRootFolder(it.application)
123+
124+
val folder = "/$path/${ArchiveUtils.AppFolderName}/"
125+
downloadPref?.summary = folder
126+
}
127+
}
128+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
5+
<androidx.constraintlayout.widget.ConstraintLayout
6+
android:id="@+id/parentContainer"
7+
android:layout_width="match_parent"
8+
android:layout_height="match_parent"
9+
android:orientation="vertical">
10+
11+
<LinearLayout
12+
android:id="@+id/toolbar"
13+
android:layout_width="match_parent"
14+
android:layout_height="?actionBarSize"
15+
android:orientation="horizontal"
16+
app:layout_constraintEnd_toEndOf="parent"
17+
app:layout_constraintStart_toStartOf="parent"
18+
app:layout_constraintTop_toTopOf="parent">
19+
20+
<ImageView
21+
android:id="@+id/toolbar_back_button"
22+
android:layout_width="@dimen/action_btn_size"
23+
android:layout_height="@dimen/action_btn_size"
24+
android:layout_gravity="center_vertical"
25+
android:layout_marginStart="@dimen/margin_normal"
26+
android:clickable="true"
27+
android:contentDescription="@string/close_settings"
28+
android:focusable="true"
29+
android:src="@drawable/ic_keyboard_arrow_left_black_24dp" />
30+
31+
<TextView
32+
android:id="@+id/toolbar_title"
33+
android:textColor="@color/black"
34+
android:layout_width="0dp"
35+
android:layout_marginStart="@dimen/margin_normal"
36+
android:textAppearance="@style/TextAppearance.AppCompat.Large"
37+
android:gravity="start|center_vertical"
38+
android:text="@string/toolbar_title_text"
39+
android:layout_height="match_parent"
40+
android:layout_weight="1"/>
41+
42+
</LinearLayout>
43+
44+
<androidx.fragment.app.FragmentContainerView
45+
android:id="@+id/fragment_container"
46+
android:layout_margin="@dimen/margin_normal"
47+
android:layout_width="match_parent"
48+
android:layout_height="wrap_content"
49+
app:layout_constraintEnd_toEndOf="parent"
50+
app:layout_constraintStart_toStartOf="parent"
51+
app:layout_constraintTop_toBottomOf="@id/toolbar">
52+
</androidx.fragment.app.FragmentContainerView>
53+
</androidx.constraintlayout.widget.ConstraintLayout>
54+
</layout>

feature_settings/src/main/res/values/dimens.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
<dimen name="fragment_popup_minWidth">800dp</dimen>
55
<dimen name="fragment_popup_minHeight">400dp</dimen>
66
<dimen name="padding_standard">16dp</dimen>
7+
<dimen name="action_btn_size">32dp</dimen>
8+
<dimen name="margin_normal">16dp</dimen>
79
</resources>

feature_settings/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@
2525
<string name="developer_mail">allsoftdroid@gmail.com</string>
2626
<string name="intent_chooser_send_mail_label">Send Mail…</string>
2727
<string name="feedback_fragment_tag_label">fragment_feedback</string>
28+
<string name="close_settings">close settings</string>
29+
<string name="toolbar_title_text">Settings</string>
2830
</resources>

0 commit comments

Comments
 (0)