Giter Club home page Giter Club logo

Comments (2)

chibatching avatar chibatching commented on June 8, 2024

Thank you for your suggestion!
It is very interesting to me! If you can, please share your solution!!

from kotpref.

MFlisar avatar MFlisar commented on June 8, 2024

What I would try to do is not (yet) possible, although via reflection it should be...

All that is missing to get something like this working is following:

  • a way to get a KotprefModule by name
  • a way to iterate all preferences inside a module

Then all default types like a string, boolean, int and so on should work.

Codes

Be aware, this is just something to start with - it's something that works for a very simply new littke app I wrote recently. Basically it looks like following:

  1. a very simply reusable activity

     class KotprefPreferenceActivity : AppCompatActivity() {
    
     	companion object {
     		fun show(activity: AppCompatActivity) {
     			activity.startActivity(Intent(activity, KotprefPreferenceActivity::class.java))
     		}
     	}
    
     	override fun onCreate(savedInstanceState: Bundle?) {
     		super.onCreate(savedInstanceState)
    
     		supportActionBar?.setTitle(R.string.settings) // TODO: get name from KotprefModule
    
     		val tag = KotprefPreferenceFragment::class.java.name
     		val fragment = fragmentManager.findFragmentByTag(tag)
     		if (fragment == null) {
     			val prefsFragment = KotprefPreferenceFragment.create(
     				"Prefs", // TODO: get name from KotprefModule
     				Context.MODE_PRIVATE // TODO: get mode from KotprefModule
     			)
     			fragmentManager
     				.beginTransaction()
     				.replace(android.R.id.content, prefsFragment, tag)
     				.commit()
     		}
     	}
     }
    
  2. the preference fragment

     class KotprefPreferenceFragment : PreferenceFragment() {
    
     	companion object {
    
     		const val KEY_NAME = "name"
     		const val KEY_MODE = "mode"
    
     		fun create(sharedPreferenceName: String, sharedPreferenceMode: Int): KotprefPreferenceFragment {
     			val fragment = KotprefPreferenceFragment()
     			val args = Bundle().apply {
     				putString(KEY_NAME, sharedPreferenceName)
     				putInt(KEY_MODE, sharedPreferenceMode)
     			}
     			fragment.arguments = args
     			return fragment
     		}
     	}
    
     	override fun onCreate(savedInstanceState: Bundle?) {
     		super.onCreate(savedInstanceState)
     		preferenceManager.sharedPreferencesName = arguments.getString(KEY_NAME)
     		preferenceManager.sharedPreferencesMode = arguments.getInt(KEY_MODE)
     	}
    
     	override fun onDestroy() {
     		// if KotprefModule would support internal caching, we would need to invalidate cache here!
     		super.onDestroy()
     	}
    
     	override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    
     		val screen = getPreferenceManager().createPreferenceScreen(activity)
    
     		// 1) get correct kotpref object
     		// 2) get list of preferences AND categories from kotpref
     		// 3) iterate over list like e.g. following: I assume that type of field is a class, could be an attribute or whatever as well -> would need to be added
     //        val parent: Any = screen
     //        for (item in items) {
     //            when (item) {
     //                is KotprefCategory -> parent = addCategory(screen, item.title)
     //                is KotprefBool -> addBoolean(item.key, item.title, item.summary, item.value)
     //                    ... TODO ...
     //            }
     //        }
    
     		// Manual way
     		addBoolean(
     			"startAppOnProfileChange",
     			R.string.pref_auto_start_app_on_profile_change,
     			R.string.pref_auto_start_app_on_profile_change_summary,
     			Prefs.startAppOnProfileChange,
     			screen
     		)
    
     		addBoolean(
     			"newProfileIsCopyOfFirst",
     			R.string.pref_new_profile_is_copy_of_first,
     			R.string.pref_new_profile_is_copy_of_first_summary,
     			Prefs.newProfileIsCopyOfFirst,
     			screen
     		)
    
     		// set preference screen
     		preferenceScreen = screen
     	}
    
     	// ----------------
     	// functions
     	// ----------------
    
     	private fun addCategory(screen: PreferenceScreen, title: Int): PreferenceCategory {
     		val category = PreferenceCategory(activity)
     		category.title = getString(title)
     		screen.addPreference(category)
     		return category
     	}
    
     	private fun addBoolean(key: String, title: Int, summary: Int, value: Boolean, parent: Any) {
     		val checkBoxPref = CheckBoxPreference(activity)
     		checkBoxPref.key = key
     		checkBoxPref.title = activity.getString(title)
     		checkBoxPref.summary = activity.getString(summary)
     		checkBoxPref.isChecked = value
     		addPreference(checkBoxPref, parent)
     	}
    
     	private fun addPreference(preference: Preference, parent: Any) {
     		when (parent) {
     			is PreferenceScreen -> parent.addPreference(preference)
     			is PreferenceCategory -> parent.addPreference(preference)
     		}
     	}
     }
    
  3. my example Kotpref module

     object Prefs : KotprefModel() {
     	var startAppOnProfileChange by booleanPref(true)
     	var newProfileIsCopyOfFirst by booleanPref(false)
     }
    

from kotpref.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.