fix: move pref props from top-level to class fields

This commit is contained in:
Akash Yadav
2024-03-29 15:48:48 +05:30
parent 108cb00cb8
commit 765d81b77b
56 changed files with 1105 additions and 1073 deletions
@@ -31,10 +31,7 @@ import com.google.android.material.transition.MaterialSharedAxis
import com.itsaky.androidide.activities.editor.EditorActivityKt
import com.itsaky.androidide.app.LimitlessIDEActivity
import com.itsaky.androidide.databinding.ActivityMainBinding
import com.itsaky.androidide.preferences.internal.NO_OPENED_PROJECT
import com.itsaky.androidide.preferences.internal.autoOpenProjects
import com.itsaky.androidide.preferences.internal.confirmProjectOpen
import com.itsaky.androidide.preferences.internal.lastOpenedProject
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.projects.ProjectManagerImpl
import com.itsaky.androidide.resources.R.string
import com.itsaky.androidide.templates.ITemplateProvider
@@ -158,12 +155,12 @@ class MainActivity : LimitlessIDEActivity() {
}
private fun tryOpenLastProject() {
if (!autoOpenProjects) {
if (!GeneralPreferences.autoOpenProjects) {
return
}
val openedProject = lastOpenedProject
if (NO_OPENED_PROJECT == openedProject) {
val openedProject = GeneralPreferences.lastOpenedProject
if (GeneralPreferences.NO_OPENED_PROJECT == openedProject) {
return
}
@@ -179,7 +176,7 @@ class MainActivity : LimitlessIDEActivity() {
return
}
if (confirmProjectOpen) {
if (GeneralPreferences.confirmProjectOpen) {
askProjectOpenPermission(project)
return
}
@@ -35,8 +35,8 @@ import com.itsaky.androidide.fragments.onboarding.OnboardingInfoFragment
import com.itsaky.androidide.fragments.onboarding.PermissionsFragment
import com.itsaky.androidide.fragments.onboarding.StatisticsFragment
import com.itsaky.androidide.models.JdkDistribution
import com.itsaky.androidide.preferences.internal.StatPreferences
import com.itsaky.androidide.preferences.internal.prefManager
import com.itsaky.androidide.preferences.internal.statConsentDialogShown
import com.itsaky.androidide.tasks.launchAsyncWithProgress
import com.itsaky.androidide.ui.themes.IThemeManager
import com.itsaky.androidide.utils.Environment
@@ -119,9 +119,9 @@ class OnboardingActivity : AppIntro2() {
return
}
if (!statConsentDialogShown) {
if (!StatPreferences.statConsentDialogShown) {
addSlide(StatisticsFragment.newInstance(this))
statConsentDialogShown = true
StatPreferences.statConsentDialogShown = true
}
if (!PermissionsFragment.areAllPermissionsGranted(this)) {
@@ -178,7 +178,7 @@ class OnboardingActivity : AppIntro2() {
private fun isSetupCompleted(): Boolean {
return checkToolsIsInstalled()
&& statConsentDialogShown
&& StatPreferences.statConsentDialogShown
&& PermissionsFragment.areAllPermissionsGranted(this)
}
@@ -65,7 +65,7 @@ import com.itsaky.androidide.models.DiagnosticGroup
import com.itsaky.androidide.models.OpenedFile
import com.itsaky.androidide.models.Range
import com.itsaky.androidide.models.SearchResult
import com.itsaky.androidide.preferences.internal.launchAppAfterInstall
import com.itsaky.androidide.preferences.internal.BuildPreferences
import com.itsaky.androidide.projects.IProjectManager
import com.itsaky.androidide.projects.ProjectManagerImpl
import com.itsaky.androidide.tasks.cancelIfActive
@@ -203,7 +203,7 @@ abstract class BaseEditorActivity : IDEActivity(), TabLayout.OnTabSelectedListen
val packageName = onResult(this, intent) ?: return
if (launchAppAfterInstall) {
if (BuildPreferences.launchAppAfterInstall) {
IntentUtils.launchApp(this, packageName)
return
}
@@ -400,7 +400,8 @@ abstract class BaseEditorActivity : IDEActivity(), TabLayout.OnTabSelectedListen
private fun handleUiDesignerResult(result: ActivityResult) {
if (result.resultCode != RESULT_OK || result.data == null) {
log.warn("UI Designer returned invalid result: resultCode={}, data={}", result.resultCode, result.data)
log.warn("UI Designer returned invalid result: resultCode={}, data={}", result.resultCode,
result.data)
return
}
val generated = result.data!!.getStringExtra(UIDesignerActivity.RESULT_GENERATED_XML)
@@ -38,8 +38,7 @@ import com.itsaky.androidide.handlers.LspHandler.destroyLanguageServers
import com.itsaky.androidide.lookup.Lookup
import com.itsaky.androidide.lsp.IDELanguageClientImpl
import com.itsaky.androidide.lsp.java.utils.CancelChecker
import com.itsaky.androidide.preferences.internal.NO_OPENED_PROJECT
import com.itsaky.androidide.preferences.internal.lastOpenedProject
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.projects.ProjectManagerImpl
import com.itsaky.androidide.projects.api.GradleProject
import com.itsaky.androidide.projects.builder.BuildService
@@ -495,7 +494,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
val initFailed = getString(string.msg_project_initialization_failed)
setStatus(initFailed)
val msg = when(failure) {
val msg = when (failure) {
PROJECT_DIRECTORY_INACCESSIBLE -> string.msg_project_dir_inaccessible
PROJECT_NOT_DIRECTORY -> string.msg_file_is_not_dir
PROJECT_NOT_FOUND -> string.msg_project_dir_doesnt_exist
@@ -634,7 +633,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
private fun initialSetup() {
val manager = ProjectManagerImpl.getInstance()
lastOpenedProject = manager.projectDirPath
GeneralPreferences.lastOpenedProject = manager.projectDirPath
try {
val project = manager.rootProject
if (project == null) {
@@ -662,7 +661,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
saveOpenedFiles()
// reset the lastOpenedProject if the user explicitly chose to close the project
lastOpenedProject = NO_OPENED_PROJECT
GeneralPreferences.lastOpenedProject = GeneralPreferences.NO_OPENED_PROJECT
}
// Make sure we close files
@@ -43,13 +43,9 @@ import com.itsaky.androidide.events.EditorEventsIndex
import com.itsaky.androidide.events.LspApiEventsIndex
import com.itsaky.androidide.events.LspJavaEventsIndex
import com.itsaky.androidide.events.ProjectsApiEventsIndex
import com.itsaky.androidide.preferences.KEY_DEVOPTS_DEBUGGING_DUMPLOGS
import com.itsaky.androidide.preferences.dumpLogs
import com.itsaky.androidide.preferences.internal.SELECTED_LOCALE
import com.itsaky.androidide.preferences.internal.STAT_OPT_IN
import com.itsaky.androidide.preferences.internal.UI_MODE
import com.itsaky.androidide.preferences.internal.statOptIn
import com.itsaky.androidide.preferences.internal.uiMode
import com.itsaky.androidide.preferences.internal.DevOpsPreferences
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.preferences.internal.StatPreferences
import com.itsaky.androidide.resources.localization.LocaleProvider
import com.itsaky.androidide.stats.AndroidIDEStats
import com.itsaky.androidide.stats.StatUploadWorker
@@ -95,7 +91,7 @@ class IDEApplication : TermuxApplication() {
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder(StrictMode.getVmPolicy()).penaltyLog().detectAll().build())
if (dumpLogs) {
if (DevOpsPreferences.dumpLogs) {
startLogcatReader()
}
}
@@ -106,7 +102,7 @@ class IDEApplication : TermuxApplication() {
EventBus.getDefault().register(this)
AppCompatDelegate.setDefaultNightMode(uiMode)
AppCompatDelegate.setDefaultNightMode(GeneralPreferences.uiMode)
if (IThemeManager.getInstance().getCurrentTheme() == IDETheme.MATERIAL_YOU) {
DynamicColors.applyToActivitiesIfAvailable(this)
@@ -155,21 +151,21 @@ class IDEApplication : TermuxApplication() {
fun reportStatsIfNecessary() {
if (!statOptIn) {
if (!StatPreferences.statOptIn) {
log.info("Stat collection is disabled.")
return
}
val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
val request = PeriodicWorkRequestBuilder<StatUploadWorker>(Duration.ofHours(24)).setInputData(
AndroidIDEStats.statData.toInputData()).setConstraints(constraints)
AndroidIDEStats.statData.toInputData()).setConstraints(constraints)
.addTag(StatUploadWorker.WORKER_WORK_NAME).build()
val workManager = WorkManager.getInstance(this)
log.info("reportStatsIfNecessary: Enqueuing StatUploadWorker...")
val operation = workManager.enqueueUniquePeriodicWork(StatUploadWorker.WORKER_WORK_NAME,
ExistingPeriodicWorkPolicy.UPDATE, request)
ExistingPeriodicWorkPolicy.UPDATE, request)
operation.state.observeForever(object : Observer<Operation.State> {
override fun onChanged(value: Operation.State) {
@@ -198,24 +194,24 @@ class IDEApplication : TermuxApplication() {
@Subscribe(threadMode = ThreadMode.MAIN)
fun onPrefChanged(event: PreferenceChangeEvent) {
val enabled = event.value as? Boolean?
if (event.key == STAT_OPT_IN) {
if (event.key == StatPreferences.STAT_OPT_IN) {
if (enabled == true) {
reportStatsIfNecessary()
} else {
cancelStatUploadWorker()
}
} else if (event.key == KEY_DEVOPTS_DEBUGGING_DUMPLOGS) {
} else if (event.key == DevOpsPreferences.KEY_DEVOPTS_DEBUGGING_DUMPLOGS) {
if (enabled == true) {
startLogcatReader()
} else {
stopLogcatReader()
}
} else if (event.key == UI_MODE && uiMode != AppCompatDelegate.getDefaultNightMode()) {
AppCompatDelegate.setDefaultNightMode(uiMode)
} else if (event.key == SELECTED_LOCALE) {
} else if (event.key == GeneralPreferences.UI_MODE && GeneralPreferences.uiMode != AppCompatDelegate.getDefaultNightMode()) {
AppCompatDelegate.setDefaultNightMode(GeneralPreferences.uiMode)
} else if (event.key == GeneralPreferences.SELECTED_LOCALE) {
// Use empty locale list if the locale has been reset to 'System Default'
val selectedLocale = com.itsaky.androidide.preferences.internal.selectedLocale
val selectedLocale = GeneralPreferences.selectedLocale
val localeListCompat = selectedLocale?.let {
LocaleListCompat.create(LocaleProvider.getLocale(selectedLocale))
} ?: LocaleListCompat.getEmptyLocaleList()
@@ -19,7 +19,7 @@ package com.itsaky.androidide.app.configuration
import com.google.auto.service.AutoService
import com.itsaky.androidide.models.JdkDistribution
import com.itsaky.androidide.preferences.internal.javaHome
import com.itsaky.androidide.preferences.internal.BuildPreferences
import com.itsaky.androidide.utils.Environment
import com.itsaky.androidide.utils.JdkUtils
import org.slf4j.LoggerFactory
@@ -49,7 +49,7 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider {
return JdkUtils.findJavaInstallations().also { distributions ->
// set the default value for the 'javaHome' preference
if (javaHome.isBlank() && distributions.isNotEmpty()) {
if (BuildPreferences.javaHome.isBlank() && distributions.isNotEmpty()) {
var defaultDist = distributions.find {
it.javaVersion.startsWith(IJdkDistributionProvider.DEFAULT_JAVA_VERSION)
}
@@ -59,10 +59,10 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider {
defaultDist = distributions[0]
}
javaHome = defaultDist.javaHome
BuildPreferences.javaHome = defaultDist.javaHome
}
val home = File(javaHome)
val home = File(BuildPreferences.javaHome)
val java = File(home, "bin/java")
// the previously selected JDK distribution does not exist
@@ -71,7 +71,7 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider {
if (distributions.isNotEmpty()) {
log.warn(
"Previously selected java.home does not exists! Falling back to ${distributions[0]}...")
javaHome = distributions[0].javaHome
BuildPreferences.javaHome = distributions[0].javaHome
}
}
@@ -79,9 +79,9 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider {
java.setExecutable(true)
}
log.debug("Setting Environment.JAVA_HOME to {}", javaHome)
log.debug("Setting Environment.JAVA_HOME to {}", BuildPreferences.javaHome)
Environment.JAVA_HOME = File(javaHome)
Environment.JAVA_HOME = File(BuildPreferences.javaHome)
Environment.JAVA = Environment.JAVA_HOME.resolve("bin/java")
}
}
@@ -6,7 +6,6 @@ import android.view.ViewGroup
import com.itsaky.androidide.R
import com.itsaky.androidide.app.IDEApplication
import com.itsaky.androidide.databinding.LayoutOnboardingStatisticsBinding
import com.itsaky.androidide.preferences.internal.statOptIn
class StatisticsFragment : OnboardingFragment() {
@@ -15,12 +14,15 @@ class StatisticsFragment : OnboardingFragment() {
get() = checkNotNull(_content) { "Fragment has been destroyed" }
companion object {
@JvmStatic
fun newInstance(context: Context) : StatisticsFragment {
fun newInstance(context: Context): StatisticsFragment {
return StatisticsFragment().apply {
arguments = Bundle().apply {
putCharSequence(KEY_ONBOARDING_TITLE, context.getString(R.string.title_androidide_statistics))
putCharSequence(KEY_ONBOARDING_SUBTITLE, context.getString(R.string.idepref_stats_optIn_summary))
putCharSequence(KEY_ONBOARDING_TITLE,
context.getString(R.string.title_androidide_statistics))
putCharSequence(KEY_ONBOARDING_SUBTITLE,
context.getString(R.string.idepref_stats_optIn_summary))
}
}
}
@@ -37,7 +39,9 @@ class StatisticsFragment : OnboardingFragment() {
}
fun updateStatOptInStatus() {
statOptIn = _content?.statOptIn?.isChecked ?: false
com.itsaky.androidide.preferences.internal.StatPreferences.statOptIn =
_content?.statOptIn?.isChecked ?: false
IDEApplication.instance.reportStatsIfNecessary()
}
}
@@ -25,7 +25,7 @@ import android.os.Bundle
import android.view.View
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.itsaky.androidide.R
import com.itsaky.androidide.preferences.logsenderEnabled
import com.itsaky.androidide.preferences.internal.DevOpsPreferences
import com.itsaky.androidide.services.log.ConnectionObserverParams
import com.itsaky.androidide.services.log.LogReceiverImpl
import com.itsaky.androidide.services.log.LogReceiverService
@@ -86,7 +86,7 @@ class AppLogFragment : LogViewFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
emptyStateViewModel.emptyMessage.value = if (logsenderEnabled) {
emptyStateViewModel.emptyMessage.value = if (DevOpsPreferences.logsenderEnabled) {
getString(R.string.msg_emptyview_applogs)
} else {
getString(R.string.msg_logsender_disabled)
@@ -125,7 +125,7 @@ class AppLogFragment : LogViewFragment() {
private fun bindToLogReceiver() {
try {
if (!logsenderEnabled) {
if (!DevOpsPreferences.logsenderEnabled) {
log.info("LogSender is disabled. LogReceiver service won't be started...")
// release the connection listener
@@ -135,7 +135,7 @@ class AppLogFragment : LogViewFragment() {
val context = context ?: return
val intent = Intent(context, LogReceiverService::class.java).setAction(
LogReceiverService.ACTION_CONNECT_LOG_CONSUMER)
LogReceiverService.ACTION_CONNECT_LOG_CONSUMER)
val serviceConnection = logServiceConnection ?: LogReceiverServiceConnection { binder ->
logReceiverImpl = binder
@@ -155,7 +155,7 @@ class AppLogFragment : LogViewFragment() {
private fun unbindFromLogReceiver() {
try {
if (!logsenderEnabled) {
if (!DevOpsPreferences.logsenderEnabled) {
return
}
@@ -19,7 +19,7 @@ package com.itsaky.androidide.handlers
import com.itsaky.androidide.R
import com.itsaky.androidide.activities.editor.EditorHandlerActivity
import com.itsaky.androidide.preferences.internal.isFirstBuild
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.resources.R.string
import com.itsaky.androidide.services.builder.GradleBuildService
import com.itsaky.androidide.tooling.api.messages.result.BuildInfo
@@ -63,7 +63,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener {
override fun prepareBuild(buildInfo: BuildInfo) {
checkActivity("prepareBuild") ?: return
val isFirstBuild = isFirstBuild
val isFirstBuild = GeneralPreferences.isFirstBuild
activity
.setStatus(
activity.getString(if (isFirstBuild) string.preparing_first else string.preparing)
@@ -87,7 +87,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener {
analyzeCurrentFile()
isFirstBuild = false
GeneralPreferences.isFirstBuild = false
activity.editorViewModel.isBuildInProgress = false
activity.flashSuccess(R.string.build_status_sucess)
@@ -106,7 +106,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener {
analyzeCurrentFile()
isFirstBuild = false
GeneralPreferences.isFirstBuild = false
activity.editorViewModel.isBuildInProgress = false
activity.flashError(R.string.build_status_failed)
@@ -24,21 +24,21 @@ import com.google.android.material.textfield.TextInputLayout
import com.itsaky.androidide.R
import com.itsaky.androidide.app.configuration.IJdkDistributionProvider
import com.itsaky.androidide.models.JdkDistribution
import com.itsaky.androidide.preferences.internal.CUSTOM_GRADLE_INSTALLATION
import com.itsaky.androidide.preferences.internal.GRADLE_CLEAR_CACHE
import com.itsaky.androidide.preferences.internal.GRADLE_COMMANDS
import com.itsaky.androidide.preferences.internal.LAUNCH_APP_AFTER_INSTALL
import com.itsaky.androidide.preferences.internal.PREF_JAVA_HOME
import com.itsaky.androidide.preferences.internal.gradleInstallationDir
import com.itsaky.androidide.preferences.internal.isBuildCacheEnabled
import com.itsaky.androidide.preferences.internal.isDebugEnabled
import com.itsaky.androidide.preferences.internal.isInfoEnabled
import com.itsaky.androidide.preferences.internal.isOfflineEnabled
import com.itsaky.androidide.preferences.internal.isScanEnabled
import com.itsaky.androidide.preferences.internal.isStacktraceEnabled
import com.itsaky.androidide.preferences.internal.isWarningModeAllEnabled
import com.itsaky.androidide.preferences.internal.javaHome
import com.itsaky.androidide.preferences.internal.launchAppAfterInstall
import com.itsaky.androidide.preferences.internal.BuildPreferences.CUSTOM_GRADLE_INSTALLATION
import com.itsaky.androidide.preferences.internal.BuildPreferences.GRADLE_CLEAR_CACHE
import com.itsaky.androidide.preferences.internal.BuildPreferences.GRADLE_COMMANDS
import com.itsaky.androidide.preferences.internal.BuildPreferences.LAUNCH_APP_AFTER_INSTALL
import com.itsaky.androidide.preferences.internal.BuildPreferences.PREF_JAVA_HOME
import com.itsaky.androidide.preferences.internal.BuildPreferences.gradleInstallationDir
import com.itsaky.androidide.preferences.internal.BuildPreferences.isBuildCacheEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isDebugEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isInfoEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isOfflineEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isScanEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isStacktraceEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.isWarningModeAllEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences.javaHome
import com.itsaky.androidide.preferences.internal.BuildPreferences.launchAppAfterInstall
import com.itsaky.androidide.resources.R.drawable
import com.itsaky.androidide.resources.R.string
import com.itsaky.androidide.tasks.executeAsync
@@ -214,7 +214,8 @@ class GradleJDKVersionPreference(
val javaVersion = jdkDistProvider.forJavaHome(javaHome)?.javaVersion
?: "<unknown>"
preference.summary = preference.context.getString(R.string.idepref_jdkVersion_summary, javaVersion)
preference.summary = preference.context.getString(R.string.idepref_jdkVersion_summary,
javaVersion)
preference.isEnabled = jdkDistProvider.installedDistributions.size > 1
}
}
@@ -18,16 +18,12 @@
package com.itsaky.androidide.preferences
import com.itsaky.androidide.R
import com.itsaky.androidide.preferences.internal.prefManager
import com.itsaky.androidide.preferences.internal.DevOpsPreferences
import kotlinx.parcelize.Parcelize
internal const val KEY_DEVOPTS = "ide.prefs.developerOptions"
internal const val KEY_DEVOPTS_DEBUGGING = "${KEY_DEVOPTS}.debugging"
internal const val KEY_DEVOPTS_DEBUGGING_DUMPLOGS = "${KEY_DEVOPTS_DEBUGGING}.dumpLogs"
internal const val KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER = "${KEY_DEVOPTS_DEBUGGING}.enableLogsender"
@Parcelize
internal class DeveloperOptionsScreen(override val key: String = KEY_DEVOPTS,
internal class DeveloperOptionsScreen(
override val key: String = DevOpsPreferences.KEY_DEVOPTS,
override val title: Int = R.string.title_developer_options,
override val summary: Int? = R.string.idepref_devOptions_summary,
override val children: List<IPreference> = mutableListOf()) : IPreferenceScreen() {
@@ -39,7 +35,7 @@ internal class DeveloperOptionsScreen(override val key: String = KEY_DEVOPTS,
@Parcelize
internal class DebuggingPreferences(
override val key: String = KEY_DEVOPTS_DEBUGGING,
override val key: String = DevOpsPreferences.KEY_DEVOPTS_DEBUGGING,
override val title: Int = R.string.idepref_group_debugging,
override val children: List<IPreference> = mutableListOf()) : IPreferenceGroup() {
@@ -49,28 +45,18 @@ internal class DebuggingPreferences(
}
}
internal var dumpLogs: Boolean
get() = prefManager.getBoolean(KEY_DEVOPTS_DEBUGGING_DUMPLOGS, false)
set(value) {
prefManager.putBoolean(KEY_DEVOPTS_DEBUGGING_DUMPLOGS, value)
}
@Parcelize
internal class DumpLogsPreference(
override val key: String = KEY_DEVOPTS_DEBUGGING_DUMPLOGS,
override val key: String = DevOpsPreferences.KEY_DEVOPTS_DEBUGGING_DUMPLOGS,
override val title: Int = R.string.idepref_devOptions_dumpLogs_title,
override val summary: Int? = R.string.idepref_devOptions_dumpLogs_summary) :
SwitchPreference(setValue = ::dumpLogs::set, getValue = ::dumpLogs::get)
internal var logsenderEnabled: Boolean
get() = prefManager.getBoolean(KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER, true)
set(value) {
prefManager.putBoolean(KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER, value)
}
SwitchPreference(setValue = DevOpsPreferences::dumpLogs::set,
getValue = DevOpsPreferences::dumpLogs::get)
@Parcelize
internal class EnableLogSenderPreference(
override val key: String = KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER,
override val key: String = DevOpsPreferences.KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER,
override val title: Int = R.string.idepref_devOptions_enableLogsender_title,
override val summary: Int? = R.string.idepref_devOptions_enableLogsender_summary) :
SwitchPreference(setValue = ::logsenderEnabled::set, getValue = ::logsenderEnabled::get)
SwitchPreference(setValue = DevOpsPreferences::logsenderEnabled::set,
getValue = DevOpsPreferences::logsenderEnabled::get)
@@ -24,45 +24,25 @@ import com.itsaky.androidide.R
import com.itsaky.androidide.databinding.LayoutTextSizeSliderBinding
import com.itsaky.androidide.editor.schemes.IDEColorScheme
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.preferences.internal.AUTO_SAVE
import com.itsaky.androidide.preferences.internal.COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.COMPLETIONS_MATCH_LOWER
import com.itsaky.androidide.preferences.internal.DEFAULT_COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.DELETE_EMPTY_LINES
import com.itsaky.androidide.preferences.internal.DELETE_TABS_ON_BACKSPACE
import com.itsaky.androidide.preferences.internal.FLAG_PASSWORD
import com.itsaky.androidide.preferences.internal.FONT_LIGATURES
import com.itsaky.androidide.preferences.internal.FONT_SIZE
import com.itsaky.androidide.preferences.internal.PIN_LINE_NUMBERS
import com.itsaky.androidide.preferences.internal.PRINTABLE_CHARS
import com.itsaky.androidide.preferences.internal.STICKY_SCROLL_ENABLED
import com.itsaky.androidide.preferences.internal.TAB_SIZE
import com.itsaky.androidide.preferences.internal.USE_CUSTOM_FONT
import com.itsaky.androidide.preferences.internal.USE_ICU
import com.itsaky.androidide.preferences.internal.USE_MAGNIFER
import com.itsaky.androidide.preferences.internal.USE_SOFT_TAB
import com.itsaky.androidide.preferences.internal.WORD_WRAP
import com.itsaky.androidide.preferences.internal.autoSave
import com.itsaky.androidide.preferences.internal.colorScheme
import com.itsaky.androidide.preferences.internal.completionsMatchLower
import com.itsaky.androidide.preferences.internal.deleteEmptyLines
import com.itsaky.androidide.preferences.internal.deleteTabsOnBackspace
import com.itsaky.androidide.preferences.internal.drawEmptyLineWs
import com.itsaky.androidide.preferences.internal.drawInnerWs
import com.itsaky.androidide.preferences.internal.drawLeadingWs
import com.itsaky.androidide.preferences.internal.drawLineBreak
import com.itsaky.androidide.preferences.internal.drawTrailingWs
import com.itsaky.androidide.preferences.internal.fontLigatures
import com.itsaky.androidide.preferences.internal.fontSize
import com.itsaky.androidide.preferences.internal.pinLineNumbers
import com.itsaky.androidide.preferences.internal.stickyScrollEnabled
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.useCustomFont
import com.itsaky.androidide.preferences.internal.useIcu
import com.itsaky.androidide.preferences.internal.useMagnifier
import com.itsaky.androidide.preferences.internal.useSoftTab
import com.itsaky.androidide.preferences.internal.visiblePasswordFlag
import com.itsaky.androidide.preferences.internal.wordwrap
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.preferences.internal.EditorPreferences.AUTO_SAVE
import com.itsaky.androidide.preferences.internal.EditorPreferences.COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.EditorPreferences.COMPLETIONS_MATCH_LOWER
import com.itsaky.androidide.preferences.internal.EditorPreferences.DEFAULT_COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.EditorPreferences.DELETE_EMPTY_LINES
import com.itsaky.androidide.preferences.internal.EditorPreferences.DELETE_TABS_ON_BACKSPACE
import com.itsaky.androidide.preferences.internal.EditorPreferences.FLAG_PASSWORD
import com.itsaky.androidide.preferences.internal.EditorPreferences.FONT_LIGATURES
import com.itsaky.androidide.preferences.internal.EditorPreferences.FONT_SIZE
import com.itsaky.androidide.preferences.internal.EditorPreferences.PIN_LINE_NUMBERS
import com.itsaky.androidide.preferences.internal.EditorPreferences.PRINTABLE_CHARS
import com.itsaky.androidide.preferences.internal.EditorPreferences.STICKY_SCROLL_ENABLED
import com.itsaky.androidide.preferences.internal.EditorPreferences.TAB_SIZE
import com.itsaky.androidide.preferences.internal.EditorPreferences.USE_CUSTOM_FONT
import com.itsaky.androidide.preferences.internal.EditorPreferences.USE_ICU
import com.itsaky.androidide.preferences.internal.EditorPreferences.USE_MAGNIFER
import com.itsaky.androidide.preferences.internal.EditorPreferences.USE_SOFT_TAB
import com.itsaky.androidide.preferences.internal.EditorPreferences.WORD_WRAP
import com.itsaky.androidide.resources.R.drawable
import com.itsaky.androidide.resources.R.string
import kotlinx.parcelize.IgnoredOnParcel
@@ -70,7 +50,7 @@ import kotlinx.parcelize.Parcelize
import kotlin.reflect.KMutableProperty0
@Parcelize
class EditorPreferences(
class EditorPreferencesScreen(
override val key: String = "idepref_editor",
override val title: Int = string.idepref_editor_title,
override val summary: Int? = string.idepref_editor_summary,
@@ -80,7 +60,7 @@ class EditorPreferences(
init {
addPreference(CommonConfigurations())
addPreference(JavaCodeConfigurations())
addPreference(XMLPreferences())
addPreference(XMLPreferencesScreen())
}
}
@@ -124,7 +104,7 @@ private class TextSize(
override fun onConfigureDialog(preference: Preference, dialog: MaterialAlertDialogBuilder) {
val binding = LayoutTextSizeSliderBinding.inflate(LayoutInflater.from(preference.context))
var size = fontSize
var size = EditorPreferences.fontSize
if (size < 6 || size > 32) {
size = 14f
}
@@ -144,7 +124,7 @@ private class TextSize(
}
private fun changeTextSize(binding: LayoutTextSizeSliderBinding, size: Float) {
fontSize = size
EditorPreferences.fontSize = size
binding.slider.value = size
}
}
@@ -155,7 +135,8 @@ private class FontLigatures(
override val title: Int = string.idepref_editor_ligatures_title,
override val summary: Int? = string.idepref_editor_ligatures_summary,
override val icon: Int? = drawable.ic_font_ligatures,
) : SwitchPreference(setValue = ::fontLigatures::set, getValue = ::fontLigatures::get)
) : SwitchPreference(setValue = EditorPreferences::fontLigatures::set,
getValue = EditorPreferences::fontLigatures::get)
@Parcelize
private class UseSoftTab(
@@ -163,7 +144,8 @@ private class UseSoftTab(
override val title: Int = string.idepref_editor_useSoftTabs_title,
override val summary: Int? = string.idepref_editor_useSoftTabs_summary,
override val icon: Int? = drawable.ic_space,
) : SwitchPreference(setValue = ::useSoftTab::set, getValue = ::useSoftTab::get)
) : SwitchPreference(setValue = EditorPreferences::useSoftTab::set,
getValue = EditorPreferences::useSoftTab::get)
@Parcelize
private class TabSize(
@@ -180,7 +162,7 @@ private class TabSize(
private val tabSizes = intArrayOf(2, 4, 6, 8)
override fun getEntries(preference: Preference): Array<PreferenceChoices.Entry> {
val currentTabSize = tabSize
val currentTabSize = EditorPreferences.tabSize
return Array(tabSizes.size) { index ->
PreferenceChoices.Entry(
label = tabSizes[index].toString(),
@@ -195,7 +177,7 @@ private class TabSize(
entry: PreferenceChoices.Entry?,
position: Int
) {
tabSize = (entry?.data as? Int?) ?: 4
EditorPreferences.tabSize = (entry?.data as? Int?) ?: 4
}
}
@@ -214,7 +196,7 @@ private class ColorSchemePreference(
private val schemes = IDEColorSchemeProvider.list()
override fun getEntries(preference: Preference): Array<PreferenceChoices.Entry> {
val currentColorScheme = colorScheme
val currentColorScheme = EditorPreferences.colorScheme
return Array(schemes.size) { index ->
PreferenceChoices.Entry(
schemes[index].name,
@@ -229,7 +211,7 @@ private class ColorSchemePreference(
entry: PreferenceChoices.Entry?,
position: Int
) {
colorScheme = (entry?.data as? IDEColorScheme?)?.key ?: DEFAULT_COLOR_SCHEME
EditorPreferences.colorScheme = (entry?.data as? IDEColorScheme?)?.key ?: DEFAULT_COLOR_SCHEME
}
}
@@ -243,11 +225,11 @@ private class NonPrintablePaintingFlags(
override fun getProperties(): Map<String, KMutableProperty0<Boolean>> {
return linkedMapOf(
"Leading" to ::drawLeadingWs,
"Trailing" to ::drawTrailingWs,
"Inner" to ::drawInnerWs,
"Empty lines" to ::drawEmptyLineWs,
"Line breaks" to ::drawLineBreak
"Leading" to EditorPreferences::drawLeadingWs,
"Trailing" to EditorPreferences::drawTrailingWs,
"Inner" to EditorPreferences::drawInnerWs,
"Empty lines" to EditorPreferences::drawEmptyLineWs,
"Line breaks" to EditorPreferences::drawLineBreak
)
}
}
@@ -258,7 +240,8 @@ private class WordWrap(
override val title: Int = string.idepref_editor_word_wrap_title,
override val summary: Int? = string.idepref_editor_word_wrap_summary,
override val icon: Int? = drawable.ic_wrap_text,
) : SwitchPreference(setValue = ::wordwrap::set, getValue = ::wordwrap::get)
) : SwitchPreference(setValue = EditorPreferences::wordwrap::set,
getValue = EditorPreferences::wordwrap::get)
@Parcelize
private class UseMagnifier(
@@ -266,7 +249,8 @@ private class UseMagnifier(
override val title: Int = string.idepref_editor_use_magnifier_title,
override val summary: Int? = string.idepref_editor_use_magnifier_summary,
override val icon: Int? = drawable.ic_loupe,
) : SwitchPreference(setValue = ::useMagnifier::set, getValue = ::useMagnifier::get)
) : SwitchPreference(setValue = EditorPreferences::useMagnifier::set,
getValue = EditorPreferences::useMagnifier::get)
@Parcelize
private class AutoSave(
@@ -274,7 +258,8 @@ private class AutoSave(
override val title: Int = string.idepref_editor_autoSave_title,
override val summary: Int? = string.idepref_editor_autoSave_summary,
override val icon: Int? = drawable.ic_save,
) : SwitchPreference(setValue = ::autoSave::set, getValue = ::autoSave::get)
) : SwitchPreference(setValue = EditorPreferences::autoSave::set,
getValue = EditorPreferences::autoSave::get)
@Parcelize
private class CompletionsMatchLower(
@@ -283,8 +268,8 @@ private class CompletionsMatchLower(
override val summary: Int? = string.idepref_java_matchLower_summary,
override val icon: Int? = drawable.ic_text_lower,
) : SwitchPreference(
setValue = ::completionsMatchLower::set,
getValue = ::completionsMatchLower::get
setValue = EditorPreferences::completionsMatchLower::set,
getValue = EditorPreferences::completionsMatchLower::get
)
@Parcelize
@@ -293,7 +278,8 @@ private class VisibiblePasswordFlag(
override val title: Int = string.idepref_visiblePassword_title,
override val summary: Int? = string.idepref_visiblePassword_summary,
override val icon: Int? = drawable.ic_password_input,
) : SwitchPreference(setValue = ::visiblePasswordFlag::set, getValue = ::visiblePasswordFlag::get)
) : SwitchPreference(setValue = EditorPreferences::visiblePasswordFlag::set,
getValue = EditorPreferences::visiblePasswordFlag::get)
@Parcelize
private class UseICU(
@@ -301,7 +287,8 @@ private class UseICU(
override val title: Int = string.idepref_useIcu_title,
override val summary: Int? = string.idepref_useIcu_summary,
override val icon: Int? = drawable.ic_expand_selection,
) : SwitchPreference(setValue = ::useIcu::set, getValue = ::useIcu::get)
) : SwitchPreference(setValue = EditorPreferences::useIcu::set,
getValue = EditorPreferences::useIcu::get)
@Parcelize
private class UseCustomFont(
@@ -309,7 +296,8 @@ private class UseCustomFont(
override val title: Int = string.idepref_customFont_title,
override val summary: Int? = string.idepref_customFont_summary,
override val icon: Int? = drawable.ic_custom_font,
) : SwitchPreference(setValue = ::useCustomFont::set, getValue = ::useCustomFont::get)
) : SwitchPreference(setValue = EditorPreferences::useCustomFont::set,
getValue = EditorPreferences::useCustomFont::get)
@Parcelize
private class DeleteEmptyLines(
@@ -317,7 +305,8 @@ private class DeleteEmptyLines(
override val title: Int = R.string.idepref_deleteEmptyLines_title,
override val summary: Int? = R.string.idepref_deleteEmptyLines_summary,
override val icon: Int? = drawable.ic_backspace
) : SwitchPreference(setValue = ::deleteEmptyLines::set, getValue = ::deleteEmptyLines::get)
) : SwitchPreference(setValue = EditorPreferences::deleteEmptyLines::set,
getValue = EditorPreferences::deleteEmptyLines::get)
@Parcelize
private class DeleteTabs(
@@ -326,7 +315,8 @@ private class DeleteTabs(
override val summary: Int? = R.string.idepref_deleteTabs_summary,
override val icon: Int? = drawable.ic_backspace
) :
SwitchPreference(setValue = ::deleteTabsOnBackspace::set, getValue = ::deleteTabsOnBackspace::get)
SwitchPreference(setValue = EditorPreferences::deleteTabsOnBackspace::set,
getValue = EditorPreferences::deleteTabsOnBackspace::get)
@Parcelize
private class StickyScrollEnabled(
@@ -334,7 +324,8 @@ private class StickyScrollEnabled(
override val title: Int = R.string.idepref_editor_stickScroll_title,
override val summary: Int? = R.string.idepref_editor_stickyScroll_summary,
override val icon: Int? = drawable.ic_sticky_scroll
) : SwitchPreference(setValue = ::stickyScrollEnabled::set, getValue = ::stickyScrollEnabled::get)
) : SwitchPreference(setValue = EditorPreferences::stickyScrollEnabled::set,
getValue = EditorPreferences::stickyScrollEnabled::get)
@Parcelize
private class PinLineNumbersEnabled(
@@ -342,4 +333,5 @@ private class PinLineNumbersEnabled(
override val title: Int = R.string.idepref_editor_pinLineNumbers_title,
override val summary: Int? = R.string.idepref_editor_pinLineNumbers_summary,
override val icon: Int? = drawable.ic_pin
) : SwitchPreference(setValue = ::pinLineNumbers::set, getValue = ::pinLineNumbers::get)
) : SwitchPreference(setValue = EditorPreferences::pinLineNumbers::set,
getValue = EditorPreferences::pinLineNumbers::get)
@@ -22,18 +22,7 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import androidx.preference.Preference
import com.itsaky.androidide.R
import com.itsaky.androidide.preferences.internal.CONFIRM_PROJECT_OPEN
import com.itsaky.androidide.preferences.internal.OPEN_PROJECTS
import com.itsaky.androidide.preferences.internal.SELECTED_LOCALE
import com.itsaky.androidide.preferences.internal.SELECTED_THEME
import com.itsaky.androidide.preferences.internal.TERMINAL_USE_SYSTEM_SHELL
import com.itsaky.androidide.preferences.internal.UI_MODE
import com.itsaky.androidide.preferences.internal.autoOpenProjects
import com.itsaky.androidide.preferences.internal.confirmProjectOpen
import com.itsaky.androidide.preferences.internal.selectedLocale
import com.itsaky.androidide.preferences.internal.selectedTheme
import com.itsaky.androidide.preferences.internal.uiMode
import com.itsaky.androidide.preferences.internal.useSystemShell
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.resources.R.drawable
import com.itsaky.androidide.resources.R.string
import com.itsaky.androidide.resources.localization.LocaleProvider
@@ -43,7 +32,7 @@ import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
class GeneralPreferences(
class GeneralPreferencesScreen(
override val key: String = "idepref_general",
override val title: Int = string.title_general,
override val summary: Int? = string.idepref_general_summary,
@@ -98,7 +87,7 @@ class TerminalConfig(
@Parcelize
class UiMode(
override val key: String = UI_MODE,
override val key: String = GeneralPreferences.UI_MODE,
override val title: Int = R.string.idepref_general_uiMode,
override val summary: Int? = R.string.idepref_general_uiMode_summary,
override val icon: Int? = R.drawable.ic_ui_mode
@@ -109,7 +98,7 @@ class UiMode(
override fun getEntries(preference: Preference): Array<PreferenceChoices.Entry> {
val context = preference.context
val currentUiMode = uiMode
val currentUiMode = GeneralPreferences.uiMode
return Array(3) { index ->
val (label, mode) = when (index) {
@@ -128,13 +117,13 @@ class UiMode(
entry: PreferenceChoices.Entry?,
position: Int
) {
uiMode = (entry?.data as? Int?) ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
GeneralPreferences.uiMode = (entry?.data as? Int?) ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
}
}
@Parcelize
class ThemeSelector(
override val key: String = SELECTED_THEME,
override val key: String = GeneralPreferences.SELECTED_THEME,
override val title: Int = R.string.idepref_general_themeSelector_title,
override val summary: Int? = R.string.idepref_general_themeSelector_summary,
override val icon: Int? = R.drawable.ic_color_scheme
@@ -161,13 +150,13 @@ class ThemeSelector(
entry: PreferenceChoices.Entry?,
position: Int
) {
selectedTheme = (entry?.data as? IDETheme?)?.name ?: IDETheme.DEFAULT.name
GeneralPreferences.selectedTheme = (entry?.data as? IDETheme?)?.name ?: IDETheme.DEFAULT.name
}
}
@Parcelize
class LocaleSelector(
override val key: String = SELECTED_LOCALE,
override val key: String = GeneralPreferences.SELECTED_LOCALE,
override val title: Int = R.string.idepref_general_localeSelector_title,
override val summary: Int? = R.string.idepref_general_localeSelector_summary,
override val icon: Int? = R.drawable.ic_translate
@@ -175,13 +164,13 @@ class LocaleSelector(
override fun getEntries(preference: Preference): Array<PreferenceChoices.Entry> {
val context = preference.context
val currentLocale = selectedLocale
val currentLocale = GeneralPreferences.selectedLocale
val supportedLocales = LocaleProvider.SUPPORTED_LOCALES.keys.toList()
return Array(supportedLocales.size + 1) { index ->
if (index == 0) {
PreferenceChoices.Entry(
label = ContextCompat.getString(context, R.string.locale_system_default),
_isChecked = selectedLocale == null,
_isChecked = GeneralPreferences.selectedLocale == null,
data = 0
)
} else {
@@ -201,7 +190,7 @@ class LocaleSelector(
entry: PreferenceChoices.Entry?,
position: Int
) {
selectedLocale = entry?.data?.let { localeKey ->
GeneralPreferences.selectedLocale = entry?.data?.let { localeKey ->
if (localeKey is Int) null else localeKey as String
}
}
@@ -209,7 +198,7 @@ class LocaleSelector(
@Parcelize
class OpenLastProject(
override val key: String = OPEN_PROJECTS,
override val key: String = GeneralPreferences.OPEN_PROJECTS,
override val title: Int = string.title_open_projects,
override val summary: Int? = string.msg_open_projects,
override val icon: Int? = drawable.ic_open_project
@@ -217,19 +206,20 @@ class OpenLastProject(
override fun onCreatePreference(context: Context): Preference {
val pref = super.onCreatePreference(context) as androidx.preference.SwitchPreference
pref.isChecked = autoOpenProjects
pref.isChecked = GeneralPreferences.autoOpenProjects
return pref
}
override fun onPreferenceChanged(preference: Preference, newValue: Any?): Boolean {
autoOpenProjects = newValue as Boolean? ?: autoOpenProjects
GeneralPreferences.autoOpenProjects = newValue as Boolean?
?: GeneralPreferences.autoOpenProjects
return true
}
}
@Parcelize
class ConfirmProjectOpen(
override val key: String = CONFIRM_PROJECT_OPEN,
override val key: String = GeneralPreferences.CONFIRM_PROJECT_OPEN,
override val title: Int = string.title_confirm_project_open,
override val summary: Int? = string.msg_confirm_project_open,
override val icon: Int? = drawable.ic_open_project
@@ -237,19 +227,20 @@ class ConfirmProjectOpen(
override fun onCreatePreference(context: Context): Preference {
val pref = super.onCreatePreference(context) as androidx.preference.SwitchPreference
pref.isChecked = confirmProjectOpen
pref.isChecked = GeneralPreferences.confirmProjectOpen
return pref
}
override fun onPreferenceChanged(preference: Preference, newValue: Any?): Boolean {
confirmProjectOpen = newValue as Boolean? ?: confirmProjectOpen
GeneralPreferences.confirmProjectOpen = newValue as Boolean?
?: GeneralPreferences.confirmProjectOpen
return true
}
}
@Parcelize
class UseSytemShell(
override val key: String = TERMINAL_USE_SYSTEM_SHELL,
override val key: String = GeneralPreferences.TERMINAL_USE_SYSTEM_SHELL,
override val title: Int = string.title_default_shell,
override val summary: Int? = string.msg_default_shell,
override val icon: Int? = drawable.ic_bash_commands
@@ -257,12 +248,12 @@ class UseSytemShell(
override fun onCreatePreference(context: Context): Preference {
val pref = super.onCreatePreference(context) as androidx.preference.SwitchPreference
pref.isChecked = useSystemShell
pref.isChecked = GeneralPreferences.useSystemShell
return pref
}
override fun onPreferenceChanged(preference: Preference, newValue: Any?): Boolean {
useSystemShell = newValue as Boolean? ?: useSystemShell
GeneralPreferences.useSystemShell = newValue as Boolean? ?: GeneralPreferences.useSystemShell
return true
}
}
@@ -18,10 +18,7 @@
package com.itsaky.androidide.preferences
import com.itsaky.androidide.R
import com.itsaky.androidide.preferences.internal.GOOGLE_CODE_STYLE
import com.itsaky.androidide.preferences.internal.JAVA_DIAGNOSTICS_ENABLED
import com.itsaky.androidide.preferences.internal.googleCodeStyle
import com.itsaky.androidide.preferences.internal.isJavaDiagnosticsEnabled
import com.itsaky.androidide.preferences.internal.JavaPreferences
import com.itsaky.androidide.resources.R.drawable
import com.itsaky.androidide.resources.R.string
import kotlinx.parcelize.Parcelize
@@ -32,6 +29,7 @@ internal class JavaCodeConfigurations(
override val title: Int = string.idepref_editor_category_java,
override val children: List<IPreference> = mutableListOf(),
) : IPreferenceGroup() {
init {
addPreference(GoogleCodeStyle())
addPreference(JavaDiagnosticsEnabled())
@@ -41,20 +39,21 @@ internal class JavaCodeConfigurations(
/** @author Akash Yadav */
@Parcelize
private class GoogleCodeStyle(
override val key: String = GOOGLE_CODE_STYLE,
override val key: String = JavaPreferences.GOOGLE_CODE_STYLE,
override val title: Int = string.idepref_java_useGoogleStyle_title,
override val summary: Int? = string.idepref_java_useGoogleStyle_summary,
override val icon: Int? = drawable.ic_format_code,
) : SwitchPreference(getValue = ::googleCodeStyle::get, setValue = ::googleCodeStyle::set)
) : SwitchPreference(getValue = JavaPreferences::googleCodeStyle::get,
setValue = JavaPreferences::googleCodeStyle::set)
@Parcelize
private class JavaDiagnosticsEnabled(
override val key: String = JAVA_DIAGNOSTICS_ENABLED,
override val key: String = JavaPreferences.JAVA_DIAGNOSTICS_ENABLED,
override val title: Int = R.string.idepref_java_diagnosticEnabled_title,
override val summary: Int? = R.string.idepref_java_diagnosticsEnabled_summary,
override val icon: Int? = drawable.ic_compilation_error
) :
SwitchPreference(
getValue = ::isJavaDiagnosticsEnabled::get,
setValue = ::isJavaDiagnosticsEnabled::set
getValue = JavaPreferences::isJavaDiagnosticsEnabled::get,
setValue = JavaPreferences::isJavaDiagnosticsEnabled::set
)
@@ -35,8 +35,8 @@ class ConfigurationPreferences(
) : IPreferenceGroup() {
init {
addPreference(GeneralPreferences())
addPreference(EditorPreferences())
addPreference(GeneralPreferencesScreen())
addPreference(EditorPreferencesScreen())
addPreference(BuildAndRunPreferences())
addPreference(TermuxPreferences())
}
@@ -50,7 +50,7 @@ class PrivacyPreferences(
) : IPreferenceGroup() {
init {
addPreference(StatPreferences())
addPreference(StatPreferencesScreen())
}
}
@@ -19,15 +19,14 @@ package com.itsaky.androidide.preferences
import android.content.Context
import androidx.preference.Preference
import com.itsaky.androidide.preferences.internal.STAT_OPT_IN
import com.itsaky.androidide.preferences.internal.statOptIn
import com.itsaky.androidide.preferences.internal.StatPreferences
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.stats.AndroidIDEStats
import com.itsaky.androidide.stats.StatUploadWorker
import kotlinx.parcelize.Parcelize
@Parcelize
class StatPreferences(
class StatPreferencesScreen(
override val key: String = "idepref_stats",
override val title: Int = R.string.title_androidide_statistics,
override val summary: Int? = R.string.summary_anonymous_usage_stats,
@@ -42,11 +41,12 @@ class StatPreferences(
@Parcelize
class StatsCollection(
override val key: String = STAT_OPT_IN,
override val key: String = StatPreferences.STAT_OPT_IN,
override val title: Int = R.string.idepref_stats_optIn_title,
override val summary: Int? = R.string.idepref_stats_optIn_summary,
override val icon: Int? = null
) : SwitchPreference(setValue = ::statOptIn::set, getValue = ::statOptIn::get)
) : SwitchPreference(setValue = StatPreferences::statOptIn::set,
getValue = StatPreferences::statOptIn::get)
@Parcelize
class PreviewDataPreferences(
@@ -18,47 +18,19 @@
package com.itsaky.androidide.preferences
import androidx.preference.Preference
import com.itsaky.androidide.preferences.internal.CLOSING_BRACKET_NEW_LINE
import com.itsaky.androidide.preferences.internal.EMPTY_ELEMENTS_BEHAVIOR
import com.itsaky.androidide.preferences.internal.INSERT_FINAL_NEW_LINE
import com.itsaky.androidide.preferences.internal.JOIN_CDATA_LINES
import com.itsaky.androidide.preferences.internal.JOIN_COMMENT_LINES
import com.itsaky.androidide.preferences.internal.JOIN_CONTENT_LINES
import com.itsaky.androidide.preferences.internal.MAX_LINE_WIDTH
import com.itsaky.androidide.preferences.internal.PRESERVED_NEW_LINES
import com.itsaky.androidide.preferences.internal.PRESERVE_ATTRIBUTE_LINE_BREAKS
import com.itsaky.androidide.preferences.internal.PRESERVE_EMPTY_CONTENT
import com.itsaky.androidide.preferences.internal.SPACE_BEFORE_EMPTY_CLOSE_TAG
import com.itsaky.androidide.preferences.internal.SPLIT_ATTRIBUTES
import com.itsaky.androidide.preferences.internal.SPLIT_ATTRIBUTES_INDENT_SIZE
import com.itsaky.androidide.preferences.internal.TRIM_FINAL_NEW_LINE
import com.itsaky.androidide.preferences.internal.TRIM_TRAILING_WHITESPACE
import com.itsaky.androidide.preferences.internal.closingBracketNewLine
import com.itsaky.androidide.preferences.internal.emptyElementsBehavior
import com.itsaky.androidide.preferences.internal.insertFinalNewLine
import com.itsaky.androidide.preferences.internal.joinCDataLines
import com.itsaky.androidide.preferences.internal.joinCommentLines
import com.itsaky.androidide.preferences.internal.joinContentLines
import com.itsaky.androidide.preferences.internal.maxLineWidth
import com.itsaky.androidide.preferences.internal.preserveAttributeLineBreaks
import com.itsaky.androidide.preferences.internal.preserveEmptyContent
import com.itsaky.androidide.preferences.internal.preservedNewLines
import com.itsaky.androidide.preferences.internal.spaceBeforeEmptyCloseTag
import com.itsaky.androidide.preferences.internal.splitAttributes
import com.itsaky.androidide.preferences.internal.splitAttributesIndentSize
import com.itsaky.androidide.preferences.internal.trimFinalNewLine
import com.itsaky.androidide.preferences.internal.trimTrailingWhitespace
import com.itsaky.androidide.preferences.internal.XmlPreferences
import com.itsaky.androidide.resources.R.string
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import org.eclipse.lemminx.dom.builder.EmptyElements
@Parcelize
class XMLPreferences(
class XMLPreferencesScreen(
override val key: String = "idepref_editor_xml",
override val title: Int = string.xml,
override val children: List<IPreference> = mutableListOf()
) : IPreferenceGroup() {
init {
addPreference(XMLFormattingOptions())
}
@@ -71,6 +43,7 @@ private class XMLFormattingOptions(
override val summary: Int? = string.xml_formatting_options_summary,
override val children: List<IPreference> = mutableListOf()
) : IPreferenceScreen() {
init {
addPreference(TrimFinalNewLines())
addPreference(InsertFinalNewLine())
@@ -92,137 +65,144 @@ private class XMLFormattingOptions(
@Parcelize
private class TrimFinalNewLines(
override val key: String = TRIM_FINAL_NEW_LINE,
override val key: String = XmlPreferences.TRIM_FINAL_NEW_LINE,
override val title: Int = string.idepref_xml_trimFinalNewLine_title,
override val summary: Int? = string.idepref_xml_trimFinalNewLine_summary
) : SwitchPreference(setValue = ::trimFinalNewLine::set, getValue = ::trimFinalNewLine::get)
) : SwitchPreference(setValue = XmlPreferences::trimFinalNewLine::set,
getValue = XmlPreferences::trimFinalNewLine::get)
@Parcelize
private class InsertFinalNewLine(
override val key: String = INSERT_FINAL_NEW_LINE,
override val key: String = XmlPreferences.INSERT_FINAL_NEW_LINE,
override val title: Int = string.idepref_xml_insertFinalNewLine_title,
override val summary: Int? = string.idepref_xml_insertFinalNewLine_summary
) : SwitchPreference(setValue = ::insertFinalNewLine::set, getValue = ::insertFinalNewLine::get)
) : SwitchPreference(setValue = XmlPreferences::insertFinalNewLine::set,
getValue = XmlPreferences::insertFinalNewLine::get)
@Parcelize
private class SplitAttributes(
override val key: String = SPLIT_ATTRIBUTES,
override val key: String = XmlPreferences.SPLIT_ATTRIBUTES,
override val title: Int = string.idepref_xml_splitAttributes_title,
override val summary: Int? = string.idepref_xml_splitAttributes_summary
) : SwitchPreference(setValue = ::splitAttributes::set, getValue = ::splitAttributes::get)
) : SwitchPreference(setValue = XmlPreferences::splitAttributes::set,
getValue = XmlPreferences::splitAttributes::get)
@Parcelize
private class JoinCDataLines(
override val key: String = JOIN_CDATA_LINES,
override val key: String = XmlPreferences.JOIN_CDATA_LINES,
override val title: Int = string.idepref_xml_joinCDataLines_title,
override val summary: Int? = string.idepref_xml_joinCDataLines_summary
) : SwitchPreference(setValue = ::joinCDataLines::set, getValue = ::joinCDataLines::get)
) : SwitchPreference(setValue = XmlPreferences::joinCDataLines::set,
getValue = XmlPreferences::joinCDataLines::get)
@Parcelize
private class JoinCommentLines(
override val key: String = JOIN_COMMENT_LINES,
override val key: String = XmlPreferences.JOIN_COMMENT_LINES,
override val title: Int = string.idepref_xml_joinComment_title,
override val summary: Int? = string.idepref_xml_joinComment_summary
) : SwitchPreference(setValue = ::joinCommentLines::set, getValue = ::joinCommentLines::get)
) : SwitchPreference(setValue = XmlPreferences::joinCommentLines::set,
getValue = XmlPreferences::joinCommentLines::get)
@Parcelize
private class JoinContentLines(
override val key: String = JOIN_CONTENT_LINES,
override val key: String = XmlPreferences.JOIN_CONTENT_LINES,
override val title: Int = string.idepref_xml_joinContent_title,
override val summary: Int? = string.idepref_xml_joinContent_summary
) : SwitchPreference(setValue = ::joinContentLines::set, getValue = ::joinContentLines::get)
) : SwitchPreference(setValue = XmlPreferences::joinContentLines::set,
getValue = XmlPreferences::joinContentLines::get)
@Parcelize
private class SpaceBeforeEmptyCloseTag(
override val key: String = SPACE_BEFORE_EMPTY_CLOSE_TAG,
override val key: String = XmlPreferences.SPACE_BEFORE_EMPTY_CLOSE_TAG,
override val title: Int = string.idepref_xml_spaceBeforeEmptyClose_title,
override val summary: Int? = string.idepref_xml_spaceBeforeEmptyClose_summary
) :
SwitchPreference(
setValue = ::spaceBeforeEmptyCloseTag::set,
getValue = ::spaceBeforeEmptyCloseTag::get
setValue = XmlPreferences::spaceBeforeEmptyCloseTag::set,
getValue = XmlPreferences::spaceBeforeEmptyCloseTag::get
)
@Parcelize
private class PreserveEmptyContent(
override val key: String = PRESERVE_EMPTY_CONTENT,
override val key: String = XmlPreferences.PRESERVE_EMPTY_CONTENT,
override val title: Int = string.idepref_xml_preserveEmptyContent_title,
override val summary: Int? = string.idepref_xml_preserveEmptyContent_summary
) :
SwitchPreference(setValue = ::preserveEmptyContent::set, getValue = ::preserveEmptyContent::get)
SwitchPreference(setValue = XmlPreferences::preserveEmptyContent::set,
getValue = XmlPreferences::preserveEmptyContent::get)
@Parcelize
private class PreserveAttributeLineBreaks(
override val key: String = PRESERVE_ATTRIBUTE_LINE_BREAKS,
override val key: String = XmlPreferences.PRESERVE_ATTRIBUTE_LINE_BREAKS,
override val title: Int = string.idepref_xml_preserveAttrLineBreaks_title,
override val summary: Int? = string.idepref_xml_preserveAttrLineBreaks_summary
) :
SwitchPreference(
setValue = ::preserveAttributeLineBreaks::set,
getValue = ::preserveAttributeLineBreaks::get
setValue = XmlPreferences::preserveAttributeLineBreaks::set,
getValue = XmlPreferences::preserveAttributeLineBreaks::get
)
@Parcelize
private class ClosingBracketNewLine(
override val key: String = CLOSING_BRACKET_NEW_LINE,
override val key: String = XmlPreferences.CLOSING_BRACKET_NEW_LINE,
override val title: Int = string.idepref_xml_closingBrackNewLine_title,
override val summary: Int? = string.idepref_xml_closingBrackNewLine_summary
) :
SwitchPreference(
setValue = ::closingBracketNewLine::set,
getValue = ::closingBracketNewLine::get
setValue = XmlPreferences::closingBracketNewLine::set,
getValue = XmlPreferences::closingBracketNewLine::get
)
@Parcelize
private class TrimTrailingWhitespace(
override val key: String = TRIM_TRAILING_WHITESPACE,
override val key: String = XmlPreferences.TRIM_TRAILING_WHITESPACE,
override val title: Int = string.idepref_xml_trimTrailingWs_title,
override val summary: Int? = string.idepref_xml_trimTrailingWs_summary
) :
SwitchPreference(
setValue = ::trimTrailingWhitespace::set,
getValue = ::trimTrailingWhitespace::get
setValue = XmlPreferences::trimTrailingWhitespace::set,
getValue = XmlPreferences::trimTrailingWhitespace::get
)
@Parcelize
private class MaxLineWidth(
override val key: String = MAX_LINE_WIDTH,
override val key: String = XmlPreferences.MAX_LINE_WIDTH,
override val title: Int = string.idepref_maxLineWidth_title,
override val summary: Int? = string.idepref_maxLineWidth_summary
) :
NumberInputEditTextPreference(
hint = string.idepref_maxLineWidth_title,
setValue = ::maxLineWidth::set,
getValue = ::maxLineWidth::get
setValue = XmlPreferences::maxLineWidth::set,
getValue = XmlPreferences::maxLineWidth::get
)
@Parcelize
private class PreservedNewLines(
override val key: String = PRESERVED_NEW_LINES,
override val key: String = XmlPreferences.PRESERVED_NEW_LINES,
override val title: Int = string.idepref_preservedNewLines_title,
override val summary: Int? = string.idepref_preservedNewLines_summary
) :
NumberInputEditTextPreference(
hint = string.idepref_preservedNewLines_title,
setValue = ::preservedNewLines::set,
getValue = ::preservedNewLines::get
setValue = XmlPreferences::preservedNewLines::set,
getValue = XmlPreferences::preservedNewLines::get
)
@Parcelize
private class SplitAttributesIndentSize(
override val key: String = SPLIT_ATTRIBUTES_INDENT_SIZE,
override val key: String = XmlPreferences.SPLIT_ATTRIBUTES_INDENT_SIZE,
override val title: Int = string.idepref_splitAttrIndentSize_title,
override val summary: Int? = string.idepref_splitAttrIndentSize_summary
) :
NumberInputEditTextPreference(
hint = string.idepref_splitAttrIndentSize_title,
setValue = ::splitAttributesIndentSize::set,
getValue = ::splitAttributesIndentSize::get
setValue = XmlPreferences::splitAttributesIndentSize::set,
getValue = XmlPreferences::splitAttributesIndentSize::get
)
@Parcelize
private class EmptyElementsBehavior(
override val key: String = EMPTY_ELEMENTS_BEHAVIOR,
override val key: String = XmlPreferences.EMPTY_ELEMENTS_BEHAVIOR,
override val title: Int = string.idepref_emptyElements_title,
override val summary: Int? = string.idepref_emptyElements_summary
) : SingleChoicePreference() {
@@ -232,7 +212,7 @@ private class EmptyElementsBehavior(
override fun getEntries(preference: Preference): Array<PreferenceChoices.Entry> {
val entries = EmptyElements.entries
val currentBehavior = EmptyElements.valueOf(emptyElementsBehavior)
val currentBehavior = EmptyElements.valueOf(XmlPreferences.emptyElementsBehavior)
return Array(entries.size) { index ->
PreferenceChoices.Entry(
@@ -248,6 +228,7 @@ private class EmptyElementsBehavior(
entry: PreferenceChoices.Entry?,
position: Int
) {
emptyElementsBehavior = (entry?.data as? EmptyElements?)?.toString() ?: "Collapse"
XmlPreferences.emptyElementsBehavior = (entry?.data as? EmptyElements?)?.toString()
?: "Collapse"
}
}
@@ -32,14 +32,8 @@ import com.itsaky.androidide.R.*
import com.itsaky.androidide.app.BaseApplication
import com.itsaky.androidide.lookup.Lookup
import com.itsaky.androidide.managers.ToolsManager
import com.itsaky.androidide.preferences.internal.isBuildCacheEnabled
import com.itsaky.androidide.preferences.internal.isDebugEnabled
import com.itsaky.androidide.preferences.internal.isInfoEnabled
import com.itsaky.androidide.preferences.internal.isOfflineEnabled
import com.itsaky.androidide.preferences.internal.isScanEnabled
import com.itsaky.androidide.preferences.internal.isStacktraceEnabled
import com.itsaky.androidide.preferences.internal.isWarningModeAllEnabled
import com.itsaky.androidide.preferences.logsenderEnabled
import com.itsaky.androidide.preferences.internal.BuildPreferences
import com.itsaky.androidide.preferences.internal.DevOpsPreferences
import com.itsaky.androidide.projects.ProjectManagerImpl
import com.itsaky.androidide.projects.builder.BuildService
import com.itsaky.androidide.resources.R
@@ -292,27 +286,27 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient,
// Override AAPT2 binary
// The one downloaded from Maven is not built for Android
extraArgs.add("-Pandroid.aapt2FromMavenOverride=" + Environment.AAPT2.absolutePath)
extraArgs.add("-P${PROPERTY_LOGSENDER_ENABLED}=${logsenderEnabled}")
if (isStacktraceEnabled) {
extraArgs.add("-P${PROPERTY_LOGSENDER_ENABLED}=${DevOpsPreferences.logsenderEnabled}")
if (BuildPreferences.isStacktraceEnabled) {
extraArgs.add("--stacktrace")
}
if (isInfoEnabled) {
if (BuildPreferences.isInfoEnabled) {
extraArgs.add("--info")
}
if (isDebugEnabled) {
if (BuildPreferences.isDebugEnabled) {
extraArgs.add("--debug")
}
if (isScanEnabled) {
if (BuildPreferences.isScanEnabled) {
extraArgs.add("--scan")
}
if (isWarningModeAllEnabled) {
if (BuildPreferences.isWarningModeAllEnabled) {
extraArgs.add("--warning-mode")
extraArgs.add("all")
}
if (isBuildCacheEnabled) {
if (BuildPreferences.isBuildCacheEnabled) {
extraArgs.add("--build-cache")
}
if (isOfflineEnabled) {
if (BuildPreferences.isOfflineEnabled) {
extraArgs.add("--offline")
}
return CompletableFuture.completedFuture(extraArgs)
@@ -17,7 +17,7 @@
package com.itsaky.androidide.services.builder
import com.itsaky.androidide.preferences.internal.gradleInstallationDir
import com.itsaky.androidide.preferences.internal.BuildPreferences
import com.itsaky.androidide.tooling.api.messages.GradleDistributionParams
/**
@@ -25,9 +25,9 @@ import com.itsaky.androidide.tooling.api.messages.GradleDistributionParams
*/
val gradleDistributionParams: GradleDistributionParams
get() {
if (gradleInstallationDir.isBlank()) {
if (BuildPreferences.gradleInstallationDir.isBlank()) {
return GradleDistributionParams.WRAPPER
}
return GradleDistributionParams.forInstallationDir(gradleInstallationDir)
return GradleDistributionParams.forInstallationDir(BuildPreferences.gradleInstallationDir)
}
@@ -24,7 +24,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.itsaky.androidide.logsender.LogSender
import com.itsaky.androidide.lookup.Lookup
import com.itsaky.androidide.models.LogLine
import com.itsaky.androidide.preferences.logsenderEnabled
import com.itsaky.androidide.preferences.internal.DevOpsPreferences
import org.slf4j.LoggerFactory
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
@@ -65,7 +65,7 @@ class LogReceiverService : Service() {
override fun onBind(intent: Intent?): IBinder? {
log.debug("Received bind request: {}", intent)
if (!logsenderEnabled) {
if (!DevOpsPreferences.logsenderEnabled) {
log.debug("Rejecting bind request. LogReceiver is disabled.")
return null
}
@@ -41,37 +41,7 @@ import com.itsaky.androidide.lsp.api.ILanguageServerRegistry
import com.itsaky.androidide.lsp.java.JavaLanguageServer
import com.itsaky.androidide.lsp.xml.XMLLanguageServer
import com.itsaky.androidide.models.Range
import com.itsaky.androidide.preferences.internal.DELETE_EMPTY_LINES
import com.itsaky.androidide.preferences.internal.DELETE_TABS_ON_BACKSPACE
import com.itsaky.androidide.preferences.internal.FLAG_LINE_BREAK
import com.itsaky.androidide.preferences.internal.FLAG_PASSWORD
import com.itsaky.androidide.preferences.internal.FLAG_WS_EMPTY_LINE
import com.itsaky.androidide.preferences.internal.FLAG_WS_INNER
import com.itsaky.androidide.preferences.internal.FLAG_WS_LEADING
import com.itsaky.androidide.preferences.internal.FLAG_WS_TRAILING
import com.itsaky.androidide.preferences.internal.FONT_LIGATURES
import com.itsaky.androidide.preferences.internal.FONT_SIZE
import com.itsaky.androidide.preferences.internal.PIN_LINE_NUMBERS
import com.itsaky.androidide.preferences.internal.STICKY_SCROLL_ENABLED
import com.itsaky.androidide.preferences.internal.USE_CUSTOM_FONT
import com.itsaky.androidide.preferences.internal.USE_ICU
import com.itsaky.androidide.preferences.internal.USE_MAGNIFER
import com.itsaky.androidide.preferences.internal.WORD_WRAP
import com.itsaky.androidide.preferences.internal.deleteEmptyLines
import com.itsaky.androidide.preferences.internal.deleteTabsOnBackspace
import com.itsaky.androidide.preferences.internal.drawEmptyLineWs
import com.itsaky.androidide.preferences.internal.drawInnerWs
import com.itsaky.androidide.preferences.internal.drawLeadingWs
import com.itsaky.androidide.preferences.internal.drawLineBreak
import com.itsaky.androidide.preferences.internal.drawTrailingWs
import com.itsaky.androidide.preferences.internal.fontLigatures
import com.itsaky.androidide.preferences.internal.fontSize
import com.itsaky.androidide.preferences.internal.pinLineNumbers
import com.itsaky.androidide.preferences.internal.stickyScrollEnabled
import com.itsaky.androidide.preferences.internal.useCustomFont
import com.itsaky.androidide.preferences.internal.useIcu
import com.itsaky.androidide.preferences.internal.useMagnifier
import com.itsaky.androidide.preferences.internal.wordwrap
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE
import com.itsaky.androidide.tasks.cancelIfActive
import com.itsaky.androidide.tasks.runOnUiThread
@@ -376,11 +346,11 @@ class CodeEditorView(
}
private fun onMagnifierPrefChanged() {
binding.editor.getComponent(Magnifier::class.java).isEnabled = useMagnifier
binding.editor.getComponent(Magnifier::class.java).isEnabled = EditorPreferences.useMagnifier
}
private fun onWordwrapPrefChanged() {
val enabled = wordwrap
val enabled = EditorPreferences.wordwrap
binding.editor.isWordwrap = enabled
}
@@ -390,31 +360,31 @@ class CodeEditorView(
private fun onPrintingFlagsPrefChanged() {
var flags = 0
if (drawLeadingWs) {
if (EditorPreferences.drawLeadingWs) {
flags = flags or CodeEditor.FLAG_DRAW_WHITESPACE_LEADING
}
if (drawTrailingWs) {
if (EditorPreferences.drawTrailingWs) {
flags = flags or CodeEditor.FLAG_DRAW_WHITESPACE_TRAILING
}
if (drawInnerWs) {
if (EditorPreferences.drawInnerWs) {
flags = flags or CodeEditor.FLAG_DRAW_WHITESPACE_INNER
}
if (drawEmptyLineWs) {
if (EditorPreferences.drawEmptyLineWs) {
flags = flags or CodeEditor.FLAG_DRAW_WHITESPACE_FOR_EMPTY_LINE
}
if (drawLineBreak) {
if (EditorPreferences.drawLineBreak) {
flags = flags or CodeEditor.FLAG_DRAW_LINE_SEPARATOR
}
binding.editor.nonPrintablePaintingFlags = flags
}
private fun onFontLigaturesPrefChanged() {
val enabled = fontLigatures
val enabled = EditorPreferences.fontLigatures
binding.editor.isLigatureEnabled = enabled
}
private fun onFontSizePrefChanged() {
var textSize = fontSize
var textSize = EditorPreferences.fontSize
if (textSize < 6 || textSize > 32) {
textSize = 14f
}
@@ -422,29 +392,29 @@ class CodeEditorView(
}
private fun onUseIcuPrefChanged() {
binding.editor.props.useICULibToSelectWords = useIcu
binding.editor.props.useICULibToSelectWords = EditorPreferences.useIcu
}
private fun onCustomFontPrefChanged() {
val state = useCustomFont
val state = EditorPreferences.useCustomFont
binding.editor.typefaceText = customOrJBMono(state)
binding.editor.typefaceLineNumber = customOrJBMono(state)
}
private fun onDeleteEmptyLinesPrefChanged() {
binding.editor.props.deleteEmptyLineFast = deleteEmptyLines
binding.editor.props.deleteEmptyLineFast = EditorPreferences.deleteEmptyLines
}
private fun onDeleteTabsPrefChanged() {
binding.editor.props.deleteMultiSpaces = if (deleteTabsOnBackspace) -1 else 1
binding.editor.props.deleteMultiSpaces = if (EditorPreferences.deleteTabsOnBackspace) -1 else 1
}
private fun onStickyScrollEnabeldPrefChanged() {
binding.editor.props.stickyScroll = stickyScrollEnabled
binding.editor.props.stickyScroll = EditorPreferences.stickyScrollEnabled
}
private fun onPinLineNumbersPrefChanged() {
binding.editor.setPinLineNumber(pinLineNumbers)
binding.editor.setPinLineNumber(EditorPreferences.pinLineNumbers)
}
/**
@@ -476,24 +446,24 @@ class CodeEditorView(
BaseApplication.getBaseInstance().prefManager
when (event.key) {
FONT_SIZE -> onFontSizePrefChanged()
FONT_LIGATURES -> onFontLigaturesPrefChanged()
EditorPreferences.FONT_SIZE -> onFontSizePrefChanged()
EditorPreferences.FONT_LIGATURES -> onFontLigaturesPrefChanged()
FLAG_LINE_BREAK,
FLAG_WS_INNER,
FLAG_WS_EMPTY_LINE,
FLAG_WS_LEADING,
FLAG_WS_TRAILING -> onPrintingFlagsPrefChanged()
EditorPreferences.FLAG_LINE_BREAK,
EditorPreferences.FLAG_WS_INNER,
EditorPreferences.FLAG_WS_EMPTY_LINE,
EditorPreferences.FLAG_WS_LEADING,
EditorPreferences.FLAG_WS_TRAILING -> onPrintingFlagsPrefChanged()
FLAG_PASSWORD -> onInputTypePrefChanged()
WORD_WRAP -> onWordwrapPrefChanged()
USE_MAGNIFER -> onMagnifierPrefChanged()
USE_ICU -> onUseIcuPrefChanged()
USE_CUSTOM_FONT -> onCustomFontPrefChanged()
DELETE_EMPTY_LINES -> onDeleteEmptyLinesPrefChanged()
DELETE_TABS_ON_BACKSPACE -> onDeleteTabsPrefChanged()
STICKY_SCROLL_ENABLED -> onStickyScrollEnabeldPrefChanged()
PIN_LINE_NUMBERS -> onPinLineNumbersPrefChanged()
EditorPreferences.FLAG_PASSWORD -> onInputTypePrefChanged()
EditorPreferences.WORD_WRAP -> onWordwrapPrefChanged()
EditorPreferences.USE_MAGNIFER -> onMagnifierPrefChanged()
EditorPreferences.USE_ICU -> onUseIcuPrefChanged()
EditorPreferences.USE_CUSTOM_FONT -> onCustomFontPrefChanged()
EditorPreferences.DELETE_EMPTY_LINES -> onDeleteEmptyLinesPrefChanged()
EditorPreferences.DELETE_TABS_ON_BACKSPACE -> onDeleteTabsPrefChanged()
EditorPreferences.STICKY_SCROLL_ENABLED -> onStickyScrollEnabeldPrefChanged()
EditorPreferences.PIN_LINE_NUMBERS -> onPinLineNumbersPrefChanged()
}
}
@@ -19,7 +19,7 @@ package com.itsaky.androidide.ui.themes
import android.app.Activity
import com.google.auto.service.AutoService
import com.itsaky.androidide.preferences.internal.selectedTheme
import com.itsaky.androidide.preferences.internal.GeneralPreferences
import com.itsaky.androidide.utils.isSystemInDarkMode
/**
@@ -55,6 +55,6 @@ class ThemeManager : IThemeManager {
* Get the currently selected theme.
*/
override fun getCurrentTheme(): IDETheme {
return selectedTheme?.let { IDETheme.valueOf(it) } ?: IDETheme.DEFAULT
return GeneralPreferences.selectedTheme?.let { IDETheme.valueOf(it) } ?: IDETheme.DEFAULT
}
}
@@ -37,7 +37,7 @@ import com.itsaky.androidide.lsp.models.CompletionItemKind.INTERFACE
import com.itsaky.androidide.lsp.models.CompletionItemKind.METHOD
import com.itsaky.androidide.lsp.models.MemberCompletionData
import com.itsaky.androidide.lsp.models.MethodCompletionData
import com.itsaky.androidide.preferences.internal.useCustomFont
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.resources.R.string.msg_api_info_deprecated
import com.itsaky.androidide.resources.R.string.msg_api_info_removed
import com.itsaky.androidide.resources.R.string.msg_api_info_since
@@ -85,7 +85,8 @@ class CompletionListAdapter : EditorCompletionAdapter() {
binding.completionLabel.text = label
binding.completionType.text = type
binding.completionDetail.text = desc
binding.completionIconText.setTypeface(customOrJBMono(useCustomFont), Typeface.BOLD)
binding.completionIconText.setTypeface(customOrJBMono(EditorPreferences.useCustomFont),
Typeface.BOLD)
if (desc.isEmpty()) {
binding.completionDetail.visibility = View.GONE
}
@@ -21,8 +21,7 @@ import com.itsaky.androidide.editor.api.IEditor
import com.itsaky.androidide.editor.ui.IDECompletionPublisher
import com.itsaky.androidide.lookup.Lookup
import com.itsaky.androidide.lsp.api.ILanguageServer
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.useSoftTab
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.progress.ICancelChecker
import io.github.rosemoe.sora.lang.Language
import io.github.rosemoe.sora.lang.completion.CompletionCancelledException
@@ -46,7 +45,7 @@ abstract class IDELanguage : Language {
get() = null
open fun getTabSize(): Int {
return tabSize
return EditorPreferences.tabSize
}
@Throws(CompletionCancelledException::class)
@@ -99,7 +98,7 @@ abstract class IDELanguage : Language {
}
override fun useTab(): Boolean {
return !useSoftTab
return !EditorPreferences.useSoftTab
}
override fun getFormatter(): Formatter {
@@ -20,8 +20,7 @@ package com.itsaky.androidide.editor.schemes
import android.content.Context
import androidx.annotation.WorkerThread
import com.itsaky.androidide.eventbus.events.editor.ColorSchemeInvalidatedEvent
import com.itsaky.androidide.preferences.internal.DEFAULT_COLOR_SCHEME
import com.itsaky.androidide.preferences.internal.colorScheme
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE
import com.itsaky.androidide.utils.Environment
import com.itsaky.androidide.utils.isSystemInDarkMode
@@ -61,7 +60,7 @@ object IDEColorSchemeProvider {
*/
private var defaultScheme: IDEColorScheme? = null
get() {
return field ?: getColorScheme(DEFAULT_COLOR_SCHEME).also { scheme ->
return field ?: getColorScheme(EditorPreferences.DEFAULT_COLOR_SCHEME).also { scheme ->
field = scheme
isDefaultSchemeLoaded = scheme != null
}
@@ -75,7 +74,7 @@ object IDEColorSchemeProvider {
*/
private var currentScheme: IDEColorScheme? = null
get() {
return field ?: getColorScheme(colorScheme).also { scheme ->
return field ?: getColorScheme(EditorPreferences.colorScheme).also { scheme ->
field = scheme
isCurrentSchemeLoaded = scheme != null
}
@@ -99,7 +98,8 @@ object IDEColorSchemeProvider {
scheme.darkVariant?.load()
scheme
} catch (err: Exception) {
log.error("An error occurred while loading color scheme '{}'", colorScheme, err)
log.error("An error occurred while loading color scheme '{}'", EditorPreferences.colorScheme,
err)
null
}
}
@@ -63,8 +63,7 @@ import com.itsaky.androidide.lsp.models.SignatureHelp
import com.itsaky.androidide.lsp.models.SignatureHelpParams
import com.itsaky.androidide.models.Position
import com.itsaky.androidide.models.Range
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.visiblePasswordFlag
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.progress.ICancelChecker
import com.itsaky.androidide.syntax.colorschemes.DynamicColorScheme
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE
@@ -187,7 +186,7 @@ open class IDEEditor @JvmOverloads constructor(
*/
fun createInputTypeFlags(): Int {
var flags = EditorInfo.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE or EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS
if (visiblePasswordFlag) {
if (EditorPreferences.visiblePasswordFlag) {
flags = flags or EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
}
return flags
@@ -438,7 +437,7 @@ open class IDEEditor @JvmOverloads constructor(
}
override fun getTabWidth(): Int {
return tabSize
return EditorPreferences.tabSize
}
override fun beginSearchMode() {
@@ -17,9 +17,8 @@
package com.itsaky.androidide.lsp.api;
import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.COMPLETIONS_MATCH_LOWER;
import com.itsaky.androidide.lsp.models.CompletionsKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
/**
* Settings contain preferences for the language server. Clients can use settings to enable/disable
@@ -29,7 +28,7 @@ import com.itsaky.androidide.lsp.models.CompletionsKt;
*/
public interface IServerSettings {
String KEY_COMPLETIONS_MATCH_LOWER = COMPLETIONS_MATCH_LOWER;
String KEY_COMPLETIONS_MATCH_LOWER = EditorPreferences.COMPLETIONS_MATCH_LOWER;
/**
* Called by language server to check if the completions are enabled. If not enabled, the server
@@ -38,9 +37,10 @@ public interface IServerSettings {
* @return {@code true} if enabled, {@code false} otherwise.
*/
boolean completionsEnabled();
/**
* Called by the language server to check if the source code analysis is enabled or not.
*
* @return {@code true} if enabled, {@code false} otherwise.
*/
default boolean diagnosticsEnabled() {
@@ -34,7 +34,7 @@ import com.itsaky.androidide.lsp.java.compiler.CompileTask
import com.itsaky.androidide.lsp.java.utils.EditHelper
import com.itsaky.androidide.lsp.java.utils.JavaParserUtils
import com.itsaky.androidide.lsp.java.utils.TypeUtils.toType
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.preferences.utils.indentationString
import com.itsaky.androidide.projects.IProjectManager
import com.itsaky.androidide.resources.R
@@ -126,7 +126,7 @@ class GenerateSettersAndGettersAction : FieldBasedAction() {
}
val leaf = path.leaf
val indent = EditHelper.indent(task.task, task.root(file), leaf) + tabSize
val indent = EditHelper.indent(task.task, task.root(file), leaf) + EditorPreferences.tabSize
sb.append(createGetter(element, indent))
if (!element.modifiers.contains(FINAL)) {
sb.append(createSetter(element, indent))
@@ -29,7 +29,7 @@ import com.itsaky.androidide.lsp.java.JavaCompilerProvider
import com.itsaky.androidide.lsp.java.actions.FieldBasedAction
import com.itsaky.androidide.lsp.java.compiler.CompileTask
import com.itsaky.androidide.lsp.java.utils.EditHelper
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.preferences.utils.indentationString
import com.itsaky.androidide.projects.IProjectManager
import com.itsaky.androidide.resources.R
@@ -119,7 +119,7 @@ class GenerateToStringMethodAction : FieldBasedAction() {
val file = data.requirePath()
val editor = data[CodeEditor::class.java]!!
val trees = JavacTrees.instance(task.task)
val indent = EditHelper.indent(task.task, task.root(), type) + tabSize
val indent = EditHelper.indent(task.task, task.root(), type) + EditorPreferences.tabSize
val insert = EditHelper.insertAtEndOfClass(task.task, task.root(file), type)
val string = StringBuilder()
var isFirst = true
@@ -36,7 +36,7 @@ import com.itsaky.androidide.lsp.java.utils.JavaParserUtils
import com.itsaky.androidide.lsp.java.utils.MethodPtr
import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt
import com.itsaky.androidide.models.Position
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.preferences.utils.indentationString
import com.itsaky.androidide.projects.IProjectManager
import com.itsaky.androidide.resources.R
@@ -215,7 +215,7 @@ class OverrideSuperclassMethodsAction : BaseJavaCodeAction() {
val typeFinder = FindTypeDeclarationAt(task.task)
val classTree = typeFinder.scan(task.root(), position)
val thisClass = trees.getElement(typeFinder.path) as TypeElement
val indent = EditHelper.indent(task.task, task.root(), classTree) + tabSize
val indent = EditHelper.indent(task.task, task.root(), classTree) + EditorPreferences.tabSize
val fileImports = task.root(file).imports.map { it.qualifiedIdentifier.toString() }.toSet()
val filePackage = task.root(file).`package`.packageName.toString()
@@ -16,13 +16,11 @@
*/
package com.itsaky.androidide.lsp.java.models;
import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.GOOGLE_CODE_STYLE;
import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.isJavaDiagnosticsEnabled;
import androidx.annotation.NonNull;
import com.google.googlejavaformat.java.JavaFormatterOptions;
import com.itsaky.androidide.lsp.util.PrefBasedServerSettings;
import com.itsaky.androidide.managers.PreferenceManager;
import com.itsaky.androidide.preferences.internal.JavaPreferences;
import com.itsaky.androidide.utils.VMUtils;
/**
@@ -32,7 +30,7 @@ import com.itsaky.androidide.utils.VMUtils;
*/
public class JavaServerSettings extends PrefBasedServerSettings {
public static final String KEY_JAVA_PREF_GOOGLE_CODE_STYLE = GOOGLE_CODE_STYLE;
public static final String KEY_JAVA_PREF_GOOGLE_CODE_STYLE = JavaPreferences.GOOGLE_CODE_STYLE;
public static final int CODE_STYLE_AOSP = 0;
public static final int CODE_STYLE_GOOGLE = 1;
private static JavaServerSettings instance;
@@ -45,12 +43,12 @@ public class JavaServerSettings extends PrefBasedServerSettings {
return instance;
}
@Override
public boolean diagnosticsEnabled() {
return VMUtils.isJvm() || isJavaDiagnosticsEnabled();
return VMUtils.isJvm() || JavaPreferences.INSTANCE.isJavaDiagnosticsEnabled();
}
public JavaFormatterOptions getFormatterOptions() {
return JavaFormatterOptions.builder().formatJavadoc(true).style(getStyle()).build();
}
@@ -26,7 +26,7 @@ import com.itsaky.androidide.lsp.models.CompletionItem
import com.itsaky.androidide.lsp.models.CompletionResult
import com.itsaky.androidide.lsp.models.MatchLevel
import com.itsaky.androidide.lsp.snippets.ISnippet
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.EditorPreferences
import io.github.rosemoe.sora.text.TextUtils
import openjdk.source.tree.ClassTree
import openjdk.source.tree.CompilationUnitTree
@@ -94,7 +94,8 @@ class SnippetCompletionProvider(
}
--start
}
return TextUtils.countLeadingSpaceCount(charContent.substring(start, cursor.toInt()), tabSize)
return TextUtils.countLeadingSpaceCount(charContent.substring(start, cursor.toInt()),
EditorPreferences.tabSize)
}
private fun findSnippetScope(path: TreePath?): TreePath? {
@@ -30,7 +30,7 @@ import com.itsaky.androidide.lsp.java.visitors.FindMethodCallAt;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import com.itsaky.androidide.preferences.utils.EditorUtilKt;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -121,7 +121,7 @@ public class CreateMissingMethod extends Rewrite {
}
final int indentSpaces =
indent(task.task, compilationUnit, enclosingClass) + EditorPreferencesKt.getTabSize();
indent(task.task, compilationUnit, enclosingClass) + EditorPreferences.INSTANCE.getTabSize();
insertText = insertText.replaceAll("\n", "\n" + EditorUtilKt.indentationString(indentSpaces));
insertText += "\n";
@@ -25,7 +25,7 @@ import com.itsaky.androidide.lsp.java.utils.EditHelper;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import com.itsaky.androidide.preferences.utils.EditorUtilKt;
import java.io.IOException;
import java.nio.file.Path;
@@ -88,7 +88,8 @@ public class GenerateRecordConstructor extends Rewrite {
.append(initializers)
.append("\n}");
String string = buf.toString();
int indent = EditHelper.indent(task.task, task.root(), typeTree) + EditorPreferencesKt.getTabSize();
int indent = EditHelper.indent(task.task, task.root(), typeTree)
+ EditorPreferences.INSTANCE.getTabSize();
string = string.replaceAll("\n", "\n" + EditorUtilKt.indentationString(indent));
string = string + "\n\n";
Position insert = insertPoint(task, typeTree);
@@ -100,12 +101,20 @@ public class GenerateRecordConstructor extends Rewrite {
private List<VariableTree> fieldsNeedingInitialization(ClassTree typeTree) {
List<VariableTree> fields = new ArrayList<>();
for (Tree member : typeTree.getMembers()) {
if (!(member instanceof VariableTree)) continue;
if (!(member instanceof VariableTree)) {
continue;
}
VariableTree field = (VariableTree) member;
if (field.getInitializer() != null) continue;
if (field.getInitializer() != null) {
continue;
}
Set<Modifier> flags = field.getModifiers().getFlags();
if (flags.contains(Modifier.STATIC)) continue;
if (!flags.contains(Modifier.FINAL)) continue;
if (flags.contains(Modifier.STATIC)) {
continue;
}
if (!flags.contains(Modifier.FINAL)) {
continue;
}
fields.add(field);
}
@@ -152,7 +161,9 @@ public class GenerateRecordConstructor extends Rewrite {
for (Tree member : typeTree.getMembers()) {
if (member.getKind() == Tree.Kind.METHOD) {
MethodTree method = (MethodTree) member;
if (method.getReturnType() == null) continue;
if (method.getReturnType() == null) {
continue;
}
LOG.info("...insert constructor before {}", method.getName());
return EditHelper.insertBefore(task.task, task.root(), method);
}
@@ -30,7 +30,7 @@ import com.itsaky.androidide.lsp.models.Command;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import com.itsaky.androidide.preferences.utils.EditorUtilKt;
import com.squareup.javapoet.MethodSpec;
import java.nio.file.Path;
@@ -105,7 +105,8 @@ public class ImplementAbstractMethods extends Rewrite {
}
final Set<String> imports = new TreeSet<>();
int indent = EditHelper.indent(task.task, task.root(), thisTree) + EditorPreferencesKt.getTabSize();
int indent = EditHelper.indent(task.task, task.root(), thisTree)
+ EditorPreferences.INSTANCE.getTabSize();
for (Element member : elements.getAllMembers(thisClass)) {
if (member.getKind() == ElementKind.METHOD
&& member.getModifiers().contains(Modifier.ABSTRACT)) {
@@ -19,6 +19,7 @@ package com.itsaky.androidide.lsp.xml.models
import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory
import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory.PreserveSpace
import com.itsaky.androidide.preferences.internal.XmlPreferences
import org.eclipse.lemminx.dom.DOMElement
import org.eclipse.lemminx.dom.builder.BaseXmlFormattingOptions
import org.eclipse.lemminx.dom.builder.EmptyElements
@@ -31,38 +32,38 @@ import org.eclipse.lemminx.dom.builder.EmptyElements
open class XMLFormattingOptions : BaseXmlFormattingOptions() {
override val isTrimFinalNewLine: Boolean
get() = com.itsaky.androidide.preferences.internal.trimFinalNewLine
get() = XmlPreferences.trimFinalNewLine
override val isInsertFinalNewLine: Boolean
get() = com.itsaky.androidide.preferences.internal.insertFinalNewLine
get() = XmlPreferences.insertFinalNewLine
override val isSplitAttributes: Boolean
get() = com.itsaky.androidide.preferences.internal.splitAttributes
get() = XmlPreferences.splitAttributes
override val isJoinCDataLines: Boolean
get() = com.itsaky.androidide.preferences.internal.joinCDataLines
get() = XmlPreferences.joinCDataLines
override val isJoinCommentLines: Boolean
get() = com.itsaky.androidide.preferences.internal.joinCommentLines
get() = XmlPreferences.joinCommentLines
override val isJoinContentLines: Boolean
get() = com.itsaky.androidide.preferences.internal.joinContentLines
get() = XmlPreferences.joinContentLines
override val isSpaceBeforeEmptyCloseTag: Boolean
get() = com.itsaky.androidide.preferences.internal.spaceBeforeEmptyCloseTag
get() = XmlPreferences.spaceBeforeEmptyCloseTag
override val isPreserveEmptyContent: Boolean
get() = com.itsaky.androidide.preferences.internal.preserveEmptyContent
get() = XmlPreferences.preserveEmptyContent
override val isPreserveAttributeLineBreaks: Boolean
get() = com.itsaky.androidide.preferences.internal.preserveAttributeLineBreaks
get() = XmlPreferences.preserveAttributeLineBreaks
override val isClosingBracketNewLine: Boolean
get() = com.itsaky.androidide.preferences.internal.closingBracketNewLine
get() = XmlPreferences.closingBracketNewLine
override val isTrimTrailingWhitespace: Boolean
get() = com.itsaky.androidide.preferences.internal.trimTrailingWhitespace
get() = XmlPreferences.trimTrailingWhitespace
override val maxLineWidth: Int
get() = com.itsaky.androidide.preferences.internal.maxLineWidth
get() = XmlPreferences.maxLineWidth
override val preservedNewLines: Int
get() = com.itsaky.androidide.preferences.internal.preservedNewLines
get() = XmlPreferences.preservedNewLines
override val splitAttributesIndentSize: Int
get() = com.itsaky.androidide.preferences.internal.splitAttributesIndentSize
get() = XmlPreferences.splitAttributesIndentSize
override val emptyElementsBehavior: EmptyElements
get() = EmptyElements.valueOf(
com.itsaky.androidide.preferences.internal.emptyElementsBehavior)
XmlPreferences.emptyElementsBehavior)
private val preserveSpace =
listOf("xsl:text", "xsl:comment", "xsl:processing-instruction",
@@ -29,7 +29,7 @@
package com.itsaky.androidide.lsp.xml.providers.format;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import java.util.List;
import org.eclipse.lemminx.dom.DOMCDATASection;
@@ -115,7 +115,7 @@ public class DOMCDATAFormatter {
}
private int getTabSize() {
return EditorPreferencesKt.getTabSize();
return EditorPreferences.INSTANCE.getTabSize();
}
private int getMaxLineWidth() {
@@ -29,7 +29,7 @@
package com.itsaky.androidide.lsp.xml.providers.format;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import java.util.List;
import org.eclipse.lemminx.dom.DOMComment;
@@ -111,7 +111,7 @@ public class DOMCommentFormatter {
}
private int getTabSize() {
return EditorPreferencesKt.getTabSize();
return EditorPreferences.INSTANCE.getTabSize();
}
private int getMaxLineWidth() {
@@ -32,7 +32,7 @@ import com.itsaky.androidide.lsp.xml.models.XMLServerSettings;
import com.itsaky.androidide.lsp.xml.utils.XMLBuilder;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.lemminx.commons.BadLocationException;
@@ -59,6 +59,7 @@ import org.eclipse.lemminx.dom.builder.EmptyElements;
* @author Angelo ZERR
*/
public class XMLFormatterDocument {
private final TextDocument textDocument;
private final Range range;
private final XMLServerSettings sharedSettings = XMLServerSettings.INSTANCE;
@@ -73,7 +74,9 @@ public class XMLFormatterDocument {
private boolean linefeedOnNextWrite;
private boolean withinDTDContent;
/** XML formatter document. */
/**
* XML formatter document.
*/
public XMLFormatterDocument(TextDocument textDocument, Range range) {
this.textDocument = textDocument;
this.range = range;
@@ -217,8 +220,8 @@ public class XMLFormatterDocument {
int spaceOrTab = getSpaceOrTabStartOfString(textBeforeNode);
if (EditorPreferencesKt.getUseSoftTab()) {
return (spaceOrTab / EditorPreferencesKt.getTabSize());
if (EditorPreferences.INSTANCE.getUseSoftTab()) {
return (spaceOrTab / EditorPreferences.INSTANCE.getTabSize());
}
return spaceOrTab;
}
@@ -290,7 +293,7 @@ public class XMLFormatterDocument {
!node.getOwnerDocument().isDTD()
&& !(node.isComment() && ((DOMComment) node).isCommentSameLineEndTag())
&& (!node.isText()
|| (!((DOMText) node).isWhitespace() && ((DOMText) node).hasSiblings()));
|| (!((DOMText) node).isWhitespace() && ((DOMText) node).hasSiblings()));
if (this.indentLevel > 0 && doLineFeed) {
// add new line + indent
@@ -395,7 +398,9 @@ public class XMLFormatterDocument {
}
}
/** Format the given DOM ProcessingIntsruction. */
/**
* Format the given DOM ProcessingIntsruction.
*/
private void formatProcessingInstruction(DOMNode node) {
addPIToXMLBuilder(node, this.xmlBuilder);
if (this.indentLevel == 0) {
@@ -403,7 +408,9 @@ public class XMLFormatterDocument {
}
}
/** Format the given DOM Comment */
/**
* Format the given DOM Comment
*/
private void formatComment(DOMComment comment) {
this.xmlBuilder.startComment(comment);
this.xmlBuilder.addContentComment(comment.getData());
@@ -416,7 +423,9 @@ public class XMLFormatterDocument {
}
}
/** Format the given DOM CDATA */
/**
* Format the given DOM CDATA
*/
private void formatCDATA(DOMCDATASection cdata) {
this.xmlBuilder.startCDATA();
this.xmlBuilder.addContentCDATA(cdata.getData());
@@ -492,8 +501,8 @@ public class XMLFormatterDocument {
}
/**
* Formats the start tag's closing bracket (>) according to {@code
* XMLFormattingOptions#isPreserveAttrLineBreaks()}
* Formats the start tag's closing bracket (>) according to
* {@code XMLFormattingOptions#isPreserveAttrLineBreaks()}
*
* <p>{@code XMLFormattingOptions#isPreserveAttrLineBreaks()}: If true, must add a newline +
* indent before the closing bracket if the last attribute of the element and the closing bracket
@@ -513,8 +522,8 @@ public class XMLFormatterDocument {
}
/**
* Formats the self-closing tag (/>) according to {@code
* XMLFormattingOptions#isPreserveAttrLineBreaks()}
* Formats the self-closing tag (/>) according to
* {@code XMLFormattingOptions#isPreserveAttrLineBreaks()}
*
* <p>{@code XMLFormattingOptions#isPreserveAttrLineBreaks()}: If true, must add a newline +
* indent before the self-closing tag if the last attribute of the element and the closing bracket
@@ -549,7 +558,7 @@ public class XMLFormatterDocument {
prevOffset = attr.getEnd();
}
if ((this.sharedSettings.getFormattingOptions().isClosingBracketNewLine()
&& this.sharedSettings.getFormattingOptions().isSplitAttributes())
&& this.sharedSettings.getFormattingOptions().isSplitAttributes())
&& !isSingleAttribute) {
xmlBuilder.linefeed();
// Indent by tag + splitAttributesIndentSize to match with attribute indent
@@ -581,7 +590,7 @@ public class XMLFormatterDocument {
* <p>If current formatting is range formatting, the provided offsets must be ranged offsets
* (offsets relative to the formatting range)
*
* @param first the first offset
* @param first the first offset
* @param second the second offset
* @return true if first offset and second offset belong in the same line of the document
* @throws BadLocationException
@@ -613,7 +622,7 @@ public class XMLFormatterDocument {
*
* @param element
* @return true if the provided element has one attribute in the fullDomDocument (not the
* rangeDomDocument)
* rangeDomDocument)
*/
private boolean hasSingleAttributeInFullDoc(DOMElement element) {
DOMElement fullElement = getFullDocElemFromRangeElem(element);
@@ -632,17 +641,16 @@ public class XMLFormatterDocument {
// Element is empty and closed
switch (this.emptyElements) {
case Expand:
case Collapse:
{
if (this.sharedSettings.getFormattingOptions().isPreserveEmptyContent()) {
// preserve content
if (element.hasChildNodes()) {
// The element is empty and contains somes spaces which must be preserved
return EmptyElements.Ignore;
}
case Collapse: {
if (this.sharedSettings.getFormattingOptions().isPreserveEmptyContent()) {
// preserve content
if (element.hasChildNodes()) {
// The element is empty and contains somes spaces which must be preserved
return EmptyElements.Ignore;
}
return this.emptyElements;
}
return this.emptyElements;
}
default:
return this.emptyElements;
}
@@ -787,7 +795,9 @@ public class XMLFormatterDocument {
xml.endPrologOrPI();
}
/** Will add all attributes, to the given builder, on a single line */
/**
* Will add all attributes, to the given builder, on a single line
*/
private static void addPrologAttributes(DOMNode node, XMLBuilder xmlBuilder) {
List<DOMAttr> attrs = node.getAttributeNodes();
if (attrs == null) {
@@ -33,7 +33,7 @@ import com.itsaky.androidide.lsp.xml.models.XMLFormattingOptions;
import com.itsaky.androidide.lsp.xml.models.XMLServerSettings;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.preferences.internal.EditorPreferences;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
@@ -94,7 +94,9 @@ public class XMLFormatterDocumentNew {
private CancelChecker cancelChecker;
/** XML formatter document. */
/**
* XML formatter document.
*/
public XMLFormatterDocumentNew(DOMDocument xmlDocument, Range range) {
this.xmlDocument = xmlDocument;
this.textDocument = xmlDocument.getTextDocument();
@@ -198,8 +200,8 @@ public class XMLFormatterDocumentNew {
* Returns the DOM node to format according to the given range and the DOM document otherwise.
*
* @param document the DOM document.
* @param start the start range offset and -1 otherwise.
* @param end the end range offset and -1 otherwise.
* @param start the start range offset and -1 otherwise.
* @param end the end range offset and -1 otherwise.
* @return the DOM node to format according to the given range and the DOM document otherwise.
*/
private static DOMNode getDOMNodeToFormat(DOMDocument document, int start, int end) {
@@ -340,7 +342,8 @@ public class XMLFormatterDocumentNew {
}
}
public void formatAttributeValue(DOMAttr attr, int indentLevel, List<TextEdit> edits) {}
public void formatAttributeValue(DOMAttr attr, int indentLevel, List<TextEdit> edits) {
}
public void removeLeftSpaces(int leftLimit, int to, List<TextEdit> edits) {
replaceLeftSpacesWith(leftLimit, to, "", edits);
@@ -515,7 +518,7 @@ public class XMLFormatterDocumentNew {
/**
* Returns the format element category of the given DOM element.
*
* @param element the DOM element.
* @param element the DOM element.
* @param parentConstraints the parent constraints.
* @return the format element category of the given DOM element.
*/
@@ -593,7 +596,7 @@ public class XMLFormatterDocumentNew {
/**
* Return the expected indent spaces and new lines with the specified number of new lines.
*
* @param level the indent level.
* @param level the indent level.
* @param newLineCount the number of new lines to be added.
* @return the expected indent spaces and new lines with the specified number of new lines.
*/
@@ -673,11 +676,11 @@ public class XMLFormatterDocumentNew {
}
private int getTabSize() {
return EditorPreferencesKt.getTabSize();
return EditorPreferences.INSTANCE.getTabSize();
}
private boolean isInsertSpaces() {
return EditorPreferencesKt.getUseSoftTab();
return EditorPreferences.INSTANCE.getUseSoftTab();
}
private boolean isTrimFinalNewlines() {
@@ -0,0 +1,113 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object BuildPreferences {
const val STACKTRACE = "idepref_gradleCmd_stacktrace"
const val DEBUG = "idepref_gradleCmd_debug"
const val SCAN = "idepref_gradleCmd_scan"
const val INFO = "idepref_gradleCmd_info"
const val WARNING_MODE = "idepref_gradleCmd_warningMode"
const val BUILD_CACHE = "idepref_gradleCmd_buildCache"
const val OFFLINE_MODE = "idepref_gradleCmd_offlineMode"
const val GRADLE_COMMANDS = "idepref_build_gradleCommands"
const val GRADLE_CLEAR_CACHE = "idepref_build_gradleClearCache"
const val CUSTOM_GRADLE_INSTALLATION = "idepref_build_customGradleInstallation"
const val LAUNCH_APP_AFTER_INSTALL = "ide.build.run.launchAppAfterInstall"
const val PREF_JAVA_HOME = "ide.build.javaHome"
/** Switch for Gradle `--debug` option. */
var isDebugEnabled: Boolean
get() = prefManager.getBoolean(DEBUG)
set(enabled) {
prefManager.putBoolean(DEBUG, enabled)
}
/** Switch for Gradle `--scan` option. */
var isScanEnabled: Boolean
get() = prefManager.getBoolean(SCAN)
set(enabled) {
prefManager.putBoolean(SCAN, enabled)
}
/** Switch for Gradle `--warning-mode all` option. */
var isWarningModeAllEnabled: Boolean
get() = prefManager.getBoolean(WARNING_MODE)
set(enabled) {
prefManager.putBoolean(WARNING_MODE, enabled)
}
/** Switch for Gradle `--build-cache` option. */
var isBuildCacheEnabled: Boolean
get() = prefManager.getBoolean(BUILD_CACHE)
set(enabled) {
prefManager.putBoolean(BUILD_CACHE, enabled)
}
/** Switch for Gradle `--offline` option. */
var isOfflineEnabled: Boolean
get() = prefManager.getBoolean(OFFLINE_MODE)
set(enabled) {
prefManager.putBoolean(OFFLINE_MODE, enabled)
}
/** Switch for Gradle `--stacktrace` option. */
var isStacktraceEnabled: Boolean
get() = prefManager.getBoolean(STACKTRACE)
set(value) {
prefManager.putBoolean(STACKTRACE, value)
}
/** Switch for Gradle `--info` option. */
var isInfoEnabled: Boolean
get() = prefManager.getBoolean(INFO, GeneralPreferences.isFirstBuild)
set(enabled) {
prefManager.putBoolean(INFO, enabled)
}
/** Custom Gradle installation directory path. */
var gradleInstallationDir: String
get() = prefManager.getString(CUSTOM_GRADLE_INSTALLATION, "")
set(value) {
prefManager.putString(CUSTOM_GRADLE_INSTALLATION, value)
}
/**
* Whether the app should be launched automatically after installation (after build).
*/
var launchAppAfterInstall: Boolean
get() = prefManager.getBoolean(LAUNCH_APP_AFTER_INSTALL, false)
set(value) {
prefManager.putBoolean(LAUNCH_APP_AFTER_INSTALL, value)
}
/**
* The selected Java installation.
*/
var javaHome: String
get() = prefManager.getString(PREF_JAVA_HOME, "")
set(value) {
prefManager.putString(PREF_JAVA_HOME, value)
}
}
@@ -0,0 +1,42 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object DevOpsPreferences {
const val KEY_DEVOPTS = "ide.prefs.developerOptions"
const val KEY_DEVOPTS_DEBUGGING = "${KEY_DEVOPTS}.debugging"
const val KEY_DEVOPTS_DEBUGGING_DUMPLOGS = "${KEY_DEVOPTS_DEBUGGING}.dumpLogs"
const val KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER = "${KEY_DEVOPTS_DEBUGGING}.enableLogsender"
var dumpLogs: Boolean
get() = prefManager.getBoolean(KEY_DEVOPTS_DEBUGGING_DUMPLOGS, false)
set(value) {
prefManager.putBoolean(KEY_DEVOPTS_DEBUGGING_DUMPLOGS, value)
}
var logsenderEnabled: Boolean
get() = prefManager.getBoolean(KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER, true)
set(value) {
prefManager.putBoolean(KEY_DEVOPTS_DEBUGGING_ENABLE_LOGSENDER, value)
}
}
@@ -0,0 +1,177 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
/**
* Preferences for the code editor.
*
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object EditorPreferences {
const val COMPLETIONS_MATCH_LOWER = "idepref_editor_completions_matchLower"
const val FLAG_WS_LEADING = "idepref_editor_wsLeading"
const val FLAG_WS_TRAILING = "idepref_editor_wsTrailing"
const val FLAG_WS_INNER = "idepref_editor_wsInner"
const val FLAG_WS_EMPTY_LINE = "idepref_editor_wsEmptyLine"
const val FLAG_LINE_BREAK = "idepref_editor_lineBreak"
const val FONT_SIZE = "idepref_editor_fontSize"
const val PRINTABLE_CHARS = "idepref_editor_nonPrintableFlags"
const val TAB_SIZE = "idepref_editor_tabSize"
const val AUTO_SAVE = "idepref_editor_autoSave"
const val FONT_LIGATURES = "idepref_editor_fontLigatures"
const val FLAG_PASSWORD = "idepref_editor_flagPassword"
const val WORD_WRAP = "idepref_editor_word_wrap"
const val USE_MAGNIFER = "idepref_editor_use_magnifier"
const val USE_ICU = "idepref_editor_useIcu"
const val USE_SOFT_TAB = "idepref_editor_useSoftTab"
const val USE_CUSTOM_FONT = "idepref_editor_useCustomFont"
const val DELETE_EMPTY_LINES = "idepref_editor_deleteEmptyLines"
const val DELETE_TABS_ON_BACKSPACE = "idepref_editor_deleteTab"
const val STICKY_SCROLL_ENABLED = "idepref_editor_stickyScrollEnabled"
const val PIN_LINE_NUMBERS = "idepref_editor_pinLineNumbers"
const val COLOR_SCHEME = "idepref_editor_colorScheme"
const val DEFAULT_COLOR_SCHEME = "default"
var completionsMatchLower: Boolean
get() = prefManager.getBoolean(COMPLETIONS_MATCH_LOWER, false)
set(value) {
prefManager.putBoolean(COMPLETIONS_MATCH_LOWER, value)
}
var drawLeadingWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_LEADING, false)
set(value) {
prefManager.putBoolean(FLAG_WS_LEADING, value)
}
var drawTrailingWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_TRAILING, false)
set(value) {
prefManager.putBoolean(FLAG_WS_TRAILING, value)
}
var drawInnerWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_INNER, false)
set(value) {
prefManager.putBoolean(FLAG_WS_INNER, value)
}
var drawEmptyLineWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_EMPTY_LINE, false)
set(value) {
prefManager.putBoolean(FLAG_WS_EMPTY_LINE, value)
}
var drawLineBreak: Boolean
get() = prefManager.getBoolean(FLAG_LINE_BREAK, false)
set(value) {
prefManager.putBoolean(FLAG_LINE_BREAK, value)
}
var fontSize: Float
get() = prefManager.getFloat(FONT_SIZE, 14f)
set(value) {
prefManager.putFloat(FONT_SIZE, value)
}
var tabSize: Int
get() = prefManager.getInt(TAB_SIZE, 4)
set(value) {
prefManager.putInt(TAB_SIZE, value)
}
var autoSave: Boolean
get() = prefManager.getBoolean(AUTO_SAVE, false)
set(value) {
prefManager.putBoolean(AUTO_SAVE, value)
}
var fontLigatures: Boolean
get() = prefManager.getBoolean(FONT_LIGATURES, true)
set(value) {
prefManager.putBoolean(FONT_LIGATURES, value)
}
var visiblePasswordFlag: Boolean
get() = prefManager.getBoolean(FLAG_PASSWORD, true)
set(value) {
prefManager.putBoolean(FLAG_PASSWORD, value)
}
var wordwrap: Boolean
get() = prefManager.getBoolean(WORD_WRAP, false)
set(value) {
prefManager.putBoolean(WORD_WRAP, value)
}
var useMagnifier: Boolean
get() = prefManager.getBoolean(USE_MAGNIFER, true)
set(value) {
prefManager.putBoolean(USE_MAGNIFER, value)
}
var useIcu: Boolean
get() = prefManager.getBoolean(USE_ICU, false)
set(value) {
prefManager.putBoolean(USE_ICU, value)
}
var useSoftTab: Boolean
get() = prefManager.getBoolean(USE_SOFT_TAB, true)
set(value) {
prefManager.putBoolean(USE_SOFT_TAB, value)
}
var useCustomFont: Boolean
get() = prefManager.getBoolean(USE_CUSTOM_FONT, false)
set(value) {
prefManager.putBoolean(USE_CUSTOM_FONT, value)
}
var colorScheme: String
get() = prefManager.getString(COLOR_SCHEME, DEFAULT_COLOR_SCHEME)
set(value) {
prefManager.putString(COLOR_SCHEME, value)
}
var deleteEmptyLines: Boolean
get() = prefManager.getBoolean(DELETE_EMPTY_LINES, true)
set(value) {
prefManager.putBoolean(DELETE_EMPTY_LINES, value)
}
var deleteTabsOnBackspace: Boolean
get() = prefManager.getBoolean(DELETE_TABS_ON_BACKSPACE, true)
set(value) {
prefManager.putBoolean(DELETE_TABS_ON_BACKSPACE, value)
}
var stickyScrollEnabled: Boolean
get() = prefManager.getBoolean(STICKY_SCROLL_ENABLED, false)
set(value) {
prefManager.putBoolean(STICKY_SCROLL_ENABLED, value)
}
var pinLineNumbers: Boolean
get() = prefManager.getBoolean(PIN_LINE_NUMBERS, true)
set(value) = prefManager.putBoolean(PIN_LINE_NUMBERS, value)
}
@@ -0,0 +1,98 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
import androidx.appcompat.app.AppCompatDelegate
import com.itsaky.androidide.resources.localization.LocaleProvider
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object GeneralPreferences {
const val IS_FIRST_PROJECT_BUILD = "project_isFirstBuild"
const val UI_MODE = "idepref_general_uiMode"
const val SELECTED_THEME = "idpref_general_theme"
const val SELECTED_LOCALE = "idpref_general_locale"
const val OPEN_PROJECTS = "idepref_general_autoOpenProjects"
const val CONFIRM_PROJECT_OPEN = "idepref_general_confirmProjectOpen"
const val TERMINAL_USE_SYSTEM_SHELL = "idepref_general_terminalShell"
const val LAST_OPENED_PROJECT = "ide_last_project"
const val NO_OPENED_PROJECT = "<NO_OPENED_PROJECT>"
var uiMode: Int
get() = prefManager.getInt(UI_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
set(value) {
prefManager.putInt(UI_MODE, value)
}
var selectedTheme: String?
get() = prefManager.getString(SELECTED_THEME, null)
set(value) {
prefManager.putString(SELECTED_THEME, value)
}
var selectedLocale: String?
get() = prefManager.getString(SELECTED_LOCALE, null).let { locale ->
// if the locale is set to a locale key that is not supported,
// fall back to 'System default'
if (LocaleProvider.getLocale(locale) == null) {
null
} else {
locale
}
}
set(value) {
prefManager.putString(SELECTED_LOCALE, value)
}
var isFirstBuild: Boolean
get() = prefManager.getBoolean(IS_FIRST_PROJECT_BUILD, true)
set(value) {
prefManager.putBoolean(IS_FIRST_PROJECT_BUILD, value)
}
var autoOpenProjects: Boolean
get() = prefManager.getBoolean(OPEN_PROJECTS, true)
set(value) {
prefManager.putBoolean(OPEN_PROJECTS, value)
}
var confirmProjectOpen: Boolean
get() = prefManager.getBoolean(CONFIRM_PROJECT_OPEN, false)
set(value) {
prefManager.putBoolean(CONFIRM_PROJECT_OPEN, value)
}
var useSystemShell: Boolean
get() = prefManager.getBoolean(TERMINAL_USE_SYSTEM_SHELL, false)
set(value) {
prefManager.putBoolean(TERMINAL_USE_SYSTEM_SHELL, value)
}
var lastOpenedProject: String
get() = prefManager.getString(LAST_OPENED_PROJECT, NO_OPENED_PROJECT)
set(value) {
prefManager.putString(LAST_OPENED_PROJECT, value)
}
}
@@ -17,24 +17,26 @@
package com.itsaky.androidide.preferences.internal
const val STAT_COLLECTION_CONSENT_SHOWN = "ide.stats.consentShown"
const val STAT_OPT_IN = "ide.stats.optIn"
const val STAT_LAST_REPORTED = "ide.stats.lastReported"
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object JavaPreferences {
var statConsentDialogShown: Boolean
get() = prefManager.getBoolean(STAT_COLLECTION_CONSENT_SHOWN, false)
set(value) {
prefManager.putBoolean(STAT_COLLECTION_CONSENT_SHOWN, value)
}
const val GOOGLE_CODE_STYLE = "idepref_editor_java_googleCodeStyle"
const val JAVA_DIAGNOSTICS_ENABLED = "idepref_editor_java_diagnosticsEnabled"
var statOptIn: Boolean
get() = prefManager.getBoolean(STAT_OPT_IN, true)
set(value) {
prefManager.putBoolean(STAT_OPT_IN, value)
}
var googleCodeStyle: Boolean
get() = prefManager.getBoolean(GOOGLE_CODE_STYLE, false)
set(value) {
prefManager.putBoolean(GOOGLE_CODE_STYLE, value)
}
var statLastReported: Long
get() = prefManager.getLong(STAT_LAST_REPORTED, 0L)
set(value) {
prefManager.putLong(STAT_LAST_REPORTED, value)
}
/** Whether diagnostics are enabled for the Java source files. */
var isJavaDiagnosticsEnabled: Boolean
get() = prefManager.getBoolean(JAVA_DIAGNOSTICS_ENABLED, true)
set(value) {
prefManager.putBoolean(JAVA_DIAGNOSTICS_ENABLED, value)
}
}
@@ -0,0 +1,47 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object StatPreferences {
const val STAT_COLLECTION_CONSENT_SHOWN = "ide.stats.consentShown"
const val STAT_OPT_IN = "ide.stats.optIn"
const val STAT_LAST_REPORTED = "ide.stats.lastReported"
var statConsentDialogShown: Boolean
get() = prefManager.getBoolean(STAT_COLLECTION_CONSENT_SHOWN, false)
set(value) {
prefManager.putBoolean(STAT_COLLECTION_CONSENT_SHOWN, value)
}
var statOptIn: Boolean
get() = prefManager.getBoolean(STAT_OPT_IN, true)
set(value) {
prefManager.putBoolean(STAT_OPT_IN, value)
}
var statLastReported: Long
get() = prefManager.getLong(STAT_LAST_REPORTED, 0L)
set(value) {
prefManager.putLong(STAT_LAST_REPORTED, value)
}
}
@@ -0,0 +1,131 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
/**
* @author Akash Yadav
*/
@Suppress("MemberVisibilityCanBePrivate")
object XmlPreferences {
const val TRIM_FINAL_NEW_LINE = "idepref_xml_trimFinalNewLine"
const val INSERT_FINAL_NEW_LINE = "idepref_xml_insertFinalNewLine"
const val SPLIT_ATTRIBUTES = "idepref_xml_splitAttributes"
const val JOIN_CDATA_LINES = "idepref_xml_joinCDataLines"
const val JOIN_COMMENT_LINES = "idepref_xml_joinCommentLines"
const val JOIN_CONTENT_LINES = "idepref_xml_joinContentLines"
const val SPACE_BEFORE_EMPTY_CLOSE_TAG = "idepref_xml_spaceBeforeEmptyCloseTag"
const val PRESERVE_EMPTY_CONTENT = "idepref_xml_preserveEmptyContent"
const val PRESERVE_ATTRIBUTE_LINE_BREAKS = "idepref_xml_preserveAttributeLineBreaks"
const val CLOSING_BRACKET_NEW_LINE = "idepref_xml_closingBracketNewLine"
const val TRIM_TRAILING_WHITESPACE = "idepref_xml_trimTrailingWhitespace"
const val MAX_LINE_WIDTH = "idepref_xml_maxLineWidth"
const val PRESERVED_NEW_LINES = "idepref_xml_preservedNewLines"
const val SPLIT_ATTRIBUTES_INDENT_SIZE = "idepref_xml_splitAttributesIndentSize"
const val EMPTY_ELEMENTS_BEHAVIOR = "idepref_xml_emptyElementsBehavior"
var trimFinalNewLine: Boolean
get() = prefManager.getBoolean(TRIM_FINAL_NEW_LINE, false)
set(value) {
prefManager.putBoolean(TRIM_FINAL_NEW_LINE, value)
}
var insertFinalNewLine: Boolean
get() = prefManager.getBoolean(INSERT_FINAL_NEW_LINE, true)
set(value) {
prefManager.putBoolean(INSERT_FINAL_NEW_LINE, value)
}
var splitAttributes: Boolean
get() = prefManager.getBoolean(SPLIT_ATTRIBUTES, true)
set(value) {
prefManager.putBoolean(SPLIT_ATTRIBUTES, value)
}
var joinCDataLines: Boolean
get() = prefManager.getBoolean(JOIN_CDATA_LINES, false)
set(value) {
prefManager.putBoolean(JOIN_CDATA_LINES, value)
}
var joinCommentLines: Boolean
get() = prefManager.getBoolean(JOIN_COMMENT_LINES, true)
set(value) {
prefManager.putBoolean(JOIN_COMMENT_LINES, value)
}
var joinContentLines: Boolean
get() = prefManager.getBoolean(JOIN_CONTENT_LINES, false)
set(value) {
prefManager.putBoolean(JOIN_CONTENT_LINES, value)
}
var spaceBeforeEmptyCloseTag: Boolean
get() = prefManager.getBoolean(SPACE_BEFORE_EMPTY_CLOSE_TAG, true)
set(value) {
prefManager.putBoolean(SPACE_BEFORE_EMPTY_CLOSE_TAG, value)
}
var preserveEmptyContent: Boolean
get() = prefManager.getBoolean(PRESERVE_EMPTY_CONTENT, true)
set(value) {
prefManager.putBoolean(PRESERVE_EMPTY_CONTENT, value)
}
var preserveAttributeLineBreaks: Boolean
get() = prefManager.getBoolean(PRESERVE_ATTRIBUTE_LINE_BREAKS, true)
set(value) {
prefManager.putBoolean(PRESERVE_ATTRIBUTE_LINE_BREAKS, value)
}
var closingBracketNewLine: Boolean
get() = prefManager.getBoolean(CLOSING_BRACKET_NEW_LINE, false)
set(value) {
prefManager.putBoolean(CLOSING_BRACKET_NEW_LINE, value)
}
var trimTrailingWhitespace: Boolean
get() = prefManager.getBoolean(TRIM_TRAILING_WHITESPACE, true)
set(value) {
prefManager.putBoolean(TRIM_TRAILING_WHITESPACE, value)
}
var maxLineWidth: Int
get() = prefManager.getInt(MAX_LINE_WIDTH, 80)
set(value) {
prefManager.putInt(MAX_LINE_WIDTH, value)
}
var preservedNewLines: Int
get() = prefManager.getInt(PRESERVED_NEW_LINES, 2)
set(value) {
prefManager.putInt(PRESERVED_NEW_LINES, value)
}
var splitAttributesIndentSize: Int
get() = prefManager.getInt(SPLIT_ATTRIBUTES_INDENT_SIZE, EditorPreferences.tabSize / 2)
set(value) {
prefManager.putInt(SPLIT_ATTRIBUTES_INDENT_SIZE, value)
}
var emptyElementsBehavior: String
get() = prefManager.getString(EMPTY_ELEMENTS_BEHAVIOR, "Collapse")
set(value) {
prefManager.putString(EMPTY_ELEMENTS_BEHAVIOR, value)
}
}
@@ -1,110 +0,0 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
import com.itsaky.androidide.utils.Environment
// Defined in PreferenceManager so that it could be accessible from Environment class
const val STACKTRACE = "idepref_gradleCmd_stacktrace"
const val DEBUG = "idepref_gradleCmd_debug"
const val SCAN = "idepref_gradleCmd_scan"
const val INFO = "idepref_gradleCmd_info"
const val WARNING_MODE = "idepref_gradleCmd_warningMode"
const val BUILD_CACHE = "idepref_gradleCmd_buildCache"
const val OFFLINE_MODE = "idepref_gradleCmd_offlineMode"
const val GRADLE_COMMANDS = "idepref_build_gradleCommands"
const val GRADLE_CLEAR_CACHE = "idepref_build_gradleClearCache"
const val CUSTOM_GRADLE_INSTALLATION = "idepref_build_customGradleInstallation"
const val LAUNCH_APP_AFTER_INSTALL = "ide.build.run.launchAppAfterInstall"
const val PREF_JAVA_HOME = "ide.build.javaHome"
/** Switch for Gradle `--debug` option. */
var isDebugEnabled: Boolean
get() = prefManager.getBoolean(DEBUG)
set(enabled) {
prefManager.putBoolean(DEBUG, enabled)
}
/** Switch for Gradle `--scan` option. */
var isScanEnabled: Boolean
get() = prefManager.getBoolean(SCAN)
set(enabled) {
prefManager.putBoolean(SCAN, enabled)
}
/** Switch for Gradle `--warning-mode all` option. */
var isWarningModeAllEnabled: Boolean
get() = prefManager.getBoolean(WARNING_MODE)
set(enabled) {
prefManager.putBoolean(WARNING_MODE, enabled)
}
/** Switch for Gradle `--build-cache` option. */
var isBuildCacheEnabled: Boolean
get() = prefManager.getBoolean(BUILD_CACHE)
set(enabled) {
prefManager.putBoolean(BUILD_CACHE, enabled)
}
/** Switch for Gradle `--offline` option. */
var isOfflineEnabled: Boolean
get() = prefManager.getBoolean(OFFLINE_MODE)
set(enabled) {
prefManager.putBoolean(OFFLINE_MODE, enabled)
}
/** Switch for Gradle `--stacktrace` option. */
var isStacktraceEnabled: Boolean
get() = prefManager.getBoolean(STACKTRACE)
set(value) {
prefManager.putBoolean(STACKTRACE, value)
}
/** Switch for Gradle `--info` option. */
var isInfoEnabled: Boolean
get() = prefManager.getBoolean(INFO, isFirstBuild)
set(enabled) {
prefManager.putBoolean(INFO, enabled)
}
/** Custom Gradle installation directory path. */
var gradleInstallationDir: String
get() = prefManager.getString(CUSTOM_GRADLE_INSTALLATION, "")
set(value) {
prefManager.putString(CUSTOM_GRADLE_INSTALLATION, value)
}
/**
* Whether the app should be launched automatically after installation (after build).
*/
var launchAppAfterInstall: Boolean
get() = prefManager.getBoolean(LAUNCH_APP_AFTER_INSTALL, false)
set(value) {
prefManager.putBoolean(LAUNCH_APP_AFTER_INSTALL, value)
}
/**
* The selected Java installation.
*/
var javaHome : String
get() = prefManager.getString(PREF_JAVA_HOME, "")
set(value) {
prefManager.putString(PREF_JAVA_HOME, value)
}
@@ -1,168 +0,0 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
const val COMPLETIONS_MATCH_LOWER = "idepref_editor_completions_matchLower"
const val FLAG_WS_LEADING = "idepref_editor_wsLeading"
const val FLAG_WS_TRAILING = "idepref_editor_wsTrailing"
const val FLAG_WS_INNER = "idepref_editor_wsInner"
const val FLAG_WS_EMPTY_LINE = "idepref_editor_wsEmptyLine"
const val FLAG_LINE_BREAK = "idepref_editor_lineBreak"
const val FONT_SIZE = "idepref_editor_fontSize"
const val PRINTABLE_CHARS = "idepref_editor_nonPrintableFlags"
const val TAB_SIZE = "idepref_editor_tabSize"
const val AUTO_SAVE = "idepref_editor_autoSave"
const val FONT_LIGATURES = "idepref_editor_fontLigatures"
const val FLAG_PASSWORD = "idepref_editor_flagPassword"
const val WORD_WRAP = "idepref_editor_word_wrap"
const val USE_MAGNIFER = "idepref_editor_use_magnifier"
const val USE_ICU = "idepref_editor_useIcu"
const val USE_SOFT_TAB = "idepref_editor_useSoftTab"
const val USE_CUSTOM_FONT = "idepref_editor_useCustomFont"
const val DELETE_EMPTY_LINES = "idepref_editor_deleteEmptyLines"
const val DELETE_TABS_ON_BACKSPACE = "idepref_editor_deleteTab"
const val STICKY_SCROLL_ENABLED = "idepref_editor_stickyScrollEnabled"
const val PIN_LINE_NUMBERS = "idepref_editor_pinLineNumbers"
const val COLOR_SCHEME = "idepref_editor_colorScheme"
const val DEFAULT_COLOR_SCHEME = "default"
var completionsMatchLower: Boolean
get() = prefManager.getBoolean(COMPLETIONS_MATCH_LOWER, false)
set(value) {
prefManager.putBoolean(COMPLETIONS_MATCH_LOWER, value)
}
var drawLeadingWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_LEADING, false)
set(value) {
prefManager.putBoolean(FLAG_WS_LEADING, value)
}
var drawTrailingWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_TRAILING, false)
set(value) {
prefManager.putBoolean(FLAG_WS_TRAILING, value)
}
var drawInnerWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_INNER, false)
set(value) {
prefManager.putBoolean(FLAG_WS_INNER, value)
}
var drawEmptyLineWs: Boolean
get() = prefManager.getBoolean(FLAG_WS_EMPTY_LINE, false)
set(value) {
prefManager.putBoolean(FLAG_WS_EMPTY_LINE, value)
}
var drawLineBreak: Boolean
get() = prefManager.getBoolean(FLAG_LINE_BREAK, false)
set(value) {
prefManager.putBoolean(FLAG_LINE_BREAK, value)
}
var fontSize: Float
get() = prefManager.getFloat(FONT_SIZE, 14f)
set(value) {
prefManager.putFloat(FONT_SIZE, value)
}
var tabSize: Int
get() = prefManager.getInt(TAB_SIZE, 4)
set(value) {
prefManager.putInt(TAB_SIZE, value)
}
var autoSave: Boolean
get() = prefManager.getBoolean(AUTO_SAVE, false)
set(value) {
prefManager.putBoolean(AUTO_SAVE, value)
}
var fontLigatures: Boolean
get() = prefManager.getBoolean(FONT_LIGATURES, true)
set(value) {
prefManager.putBoolean(FONT_LIGATURES, value)
}
var visiblePasswordFlag: Boolean
get() = prefManager.getBoolean(FLAG_PASSWORD, true)
set(value) {
prefManager.putBoolean(FLAG_PASSWORD, value)
}
var wordwrap: Boolean
get() = prefManager.getBoolean(WORD_WRAP, false)
set(value) {
prefManager.putBoolean(WORD_WRAP, value)
}
var useMagnifier: Boolean
get() = prefManager.getBoolean(USE_MAGNIFER, true)
set(value) {
prefManager.putBoolean(USE_MAGNIFER, value)
}
var useIcu: Boolean
get() = prefManager.getBoolean(USE_ICU, false)
set(value) {
prefManager.putBoolean(USE_ICU, value)
}
var useSoftTab: Boolean
get() = prefManager.getBoolean(USE_SOFT_TAB, true)
set(value) {
prefManager.putBoolean(USE_SOFT_TAB, value)
}
var useCustomFont: Boolean
get() = prefManager.getBoolean(USE_CUSTOM_FONT, false)
set(value) {
prefManager.putBoolean(USE_CUSTOM_FONT, value)
}
var colorScheme: String
get() = prefManager.getString(COLOR_SCHEME, DEFAULT_COLOR_SCHEME)
set(value) {
prefManager.putString(COLOR_SCHEME, value)
}
var deleteEmptyLines: Boolean
get() = prefManager.getBoolean(DELETE_EMPTY_LINES, true)
set(value) {
prefManager.putBoolean(DELETE_EMPTY_LINES, value)
}
var deleteTabsOnBackspace: Boolean
get() = prefManager.getBoolean(DELETE_TABS_ON_BACKSPACE, true)
set(value) {
prefManager.putBoolean(DELETE_TABS_ON_BACKSPACE, value)
}
var stickyScrollEnabled: Boolean
get() = prefManager.getBoolean(STICKY_SCROLL_ENABLED, false)
set(value) {
prefManager.putBoolean(STICKY_SCROLL_ENABLED, value)
}
var pinLineNumbers: Boolean
get() = prefManager.getBoolean(PIN_LINE_NUMBERS, true)
set(value) = prefManager.putBoolean(PIN_LINE_NUMBERS, value)
@@ -1,89 +0,0 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
import androidx.appcompat.app.AppCompatDelegate
import com.itsaky.androidide.resources.localization.LocaleProvider
const val IS_FIRST_PROJECT_BUILD = "project_isFirstBuild"
const val UI_MODE = "idepref_general_uiMode"
const val SELECTED_THEME = "idpref_general_theme"
const val SELECTED_LOCALE = "idpref_general_locale"
const val OPEN_PROJECTS = "idepref_general_autoOpenProjects"
const val CONFIRM_PROJECT_OPEN = "idepref_general_confirmProjectOpen"
const val TERMINAL_USE_SYSTEM_SHELL = "idepref_general_terminalShell"
const val LAST_OPENED_PROJECT = "ide_last_project"
const val NO_OPENED_PROJECT = "<NO_OPENED_PROJECT>"
var uiMode: Int
get() = prefManager.getInt(UI_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
set(value) {
prefManager.putInt(UI_MODE, value)
}
var selectedTheme: String?
get() = prefManager.getString(SELECTED_THEME, null)
set(value) {
prefManager.putString(SELECTED_THEME, value)
}
var selectedLocale: String?
get() = prefManager.getString(SELECTED_LOCALE, null).let { locale ->
// if the locale is set to a locale key that is not supported,
// fall back to 'System default'
if (LocaleProvider.getLocale(locale) == null) {
null
} else {
locale
}
}
set(value) {
prefManager.putString(SELECTED_LOCALE, value)
}
var isFirstBuild: Boolean
get() = prefManager.getBoolean(IS_FIRST_PROJECT_BUILD, true)
set(value) {
prefManager.putBoolean(IS_FIRST_PROJECT_BUILD, value)
}
var autoOpenProjects: Boolean
get() = prefManager.getBoolean(OPEN_PROJECTS, true)
set(value) {
prefManager.putBoolean(OPEN_PROJECTS, value)
}
var confirmProjectOpen: Boolean
get() = prefManager.getBoolean(CONFIRM_PROJECT_OPEN, false)
set(value) {
prefManager.putBoolean(CONFIRM_PROJECT_OPEN, value)
}
var useSystemShell: Boolean
get() = prefManager.getBoolean(TERMINAL_USE_SYSTEM_SHELL, false)
set(value) {
prefManager.putBoolean(TERMINAL_USE_SYSTEM_SHELL, value)
}
var lastOpenedProject: String
get() = prefManager.getString(LAST_OPENED_PROJECT, NO_OPENED_PROJECT)
set(value) {
prefManager.putString(LAST_OPENED_PROJECT, value)
}
@@ -1,34 +0,0 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
const val GOOGLE_CODE_STYLE = "idepref_editor_java_googleCodeStyle"
const val JAVA_DIAGNOSTICS_ENABLED = "idepref_editor_java_diagnosticsEnabled"
var googleCodeStyle: Boolean
get() = prefManager.getBoolean(GOOGLE_CODE_STYLE, false)
set(value) {
prefManager.putBoolean(GOOGLE_CODE_STYLE, value)
}
/** Whether diagnostics are enabled for the Java source files. */
var isJavaDiagnosticsEnabled: Boolean
get() = prefManager.getBoolean(JAVA_DIAGNOSTICS_ENABLED, true)
set(value) {
prefManager.putBoolean(JAVA_DIAGNOSTICS_ENABLED, value)
}
@@ -20,6 +20,8 @@ package com.itsaky.androidide.preferences.internal
import com.itsaky.androidide.app.BaseApplication
import com.itsaky.androidide.managers.PreferenceManager
/** @author Akash Yadav */
/**
* The global preference manager instance.
*/
val prefManager: PreferenceManager
get() = BaseApplication.getBaseInstance().prefManager
@@ -1,124 +0,0 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.preferences.internal
const val TRIM_FINAL_NEW_LINE = "idepref_xml_trimFinalNewLine"
const val INSERT_FINAL_NEW_LINE = "idepref_xml_insertFinalNewLine"
const val SPLIT_ATTRIBUTES = "idepref_xml_splitAttributes"
const val JOIN_CDATA_LINES = "idepref_xml_joinCDataLines"
const val JOIN_COMMENT_LINES = "idepref_xml_joinCommentLines"
const val JOIN_CONTENT_LINES = "idepref_xml_joinContentLines"
const val SPACE_BEFORE_EMPTY_CLOSE_TAG = "idepref_xml_spaceBeforeEmptyCloseTag"
const val PRESERVE_EMPTY_CONTENT = "idepref_xml_preserveEmptyContent"
const val PRESERVE_ATTRIBUTE_LINE_BREAKS = "idepref_xml_preserveAttributeLineBreaks"
const val CLOSING_BRACKET_NEW_LINE = "idepref_xml_closingBracketNewLine"
const val TRIM_TRAILING_WHITESPACE = "idepref_xml_trimTrailingWhitespace"
const val MAX_LINE_WIDTH = "idepref_xml_maxLineWidth"
const val PRESERVED_NEW_LINES = "idepref_xml_preservedNewLines"
const val SPLIT_ATTRIBUTES_INDENT_SIZE = "idepref_xml_splitAttributesIndentSize"
const val EMPTY_ELEMENTS_BEHAVIOR = "idepref_xml_emptyElementsBehavior"
var trimFinalNewLine: Boolean
get() = prefManager.getBoolean(TRIM_FINAL_NEW_LINE, false)
set(value) {
prefManager.putBoolean(TRIM_FINAL_NEW_LINE, value)
}
var insertFinalNewLine: Boolean
get() = prefManager.getBoolean(INSERT_FINAL_NEW_LINE, true)
set(value) {
prefManager.putBoolean(INSERT_FINAL_NEW_LINE, value)
}
var splitAttributes: Boolean
get() = prefManager.getBoolean(SPLIT_ATTRIBUTES, true)
set(value) {
prefManager.putBoolean(SPLIT_ATTRIBUTES, value)
}
var joinCDataLines: Boolean
get() = prefManager.getBoolean(JOIN_CDATA_LINES, false)
set(value) {
prefManager.putBoolean(JOIN_CDATA_LINES, value)
}
var joinCommentLines: Boolean
get() = prefManager.getBoolean(JOIN_COMMENT_LINES, true)
set(value) {
prefManager.putBoolean(JOIN_COMMENT_LINES, value)
}
var joinContentLines: Boolean
get() = prefManager.getBoolean(JOIN_CONTENT_LINES, false)
set(value) {
prefManager.putBoolean(JOIN_CONTENT_LINES, value)
}
var spaceBeforeEmptyCloseTag: Boolean
get() = prefManager.getBoolean(SPACE_BEFORE_EMPTY_CLOSE_TAG, true)
set(value) {
prefManager.putBoolean(SPACE_BEFORE_EMPTY_CLOSE_TAG, value)
}
var preserveEmptyContent: Boolean
get() = prefManager.getBoolean(PRESERVE_EMPTY_CONTENT, true)
set(value) {
prefManager.putBoolean(PRESERVE_EMPTY_CONTENT, value)
}
var preserveAttributeLineBreaks: Boolean
get() = prefManager.getBoolean(PRESERVE_ATTRIBUTE_LINE_BREAKS, true)
set(value) {
prefManager.putBoolean(PRESERVE_ATTRIBUTE_LINE_BREAKS, value)
}
var closingBracketNewLine: Boolean
get() = prefManager.getBoolean(CLOSING_BRACKET_NEW_LINE, false)
set(value) {
prefManager.putBoolean(CLOSING_BRACKET_NEW_LINE, value)
}
var trimTrailingWhitespace: Boolean
get() = prefManager.getBoolean(TRIM_TRAILING_WHITESPACE, true)
set(value) {
prefManager.putBoolean(TRIM_TRAILING_WHITESPACE, value)
}
var maxLineWidth: Int
get() = prefManager.getInt(MAX_LINE_WIDTH, 80)
set(value) {
prefManager.putInt(MAX_LINE_WIDTH, value)
}
var preservedNewLines: Int
get() = prefManager.getInt(PRESERVED_NEW_LINES, 2)
set(value) {
prefManager.putInt(PRESERVED_NEW_LINES, value)
}
var splitAttributesIndentSize: Int
get() = prefManager.getInt(SPLIT_ATTRIBUTES_INDENT_SIZE, tabSize / 2)
set(value) {
prefManager.putInt(SPLIT_ATTRIBUTES_INDENT_SIZE, value)
}
var emptyElementsBehavior: String
get() = prefManager.getString(EMPTY_ELEMENTS_BEHAVIOR, "Collapse")
set(value) {
prefManager.putString(EMPTY_ELEMENTS_BEHAVIOR, value)
}
@@ -17,8 +17,7 @@
package com.itsaky.androidide.preferences.utils
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.preferences.internal.useSoftTab
import com.itsaky.androidide.preferences.internal.EditorPreferences
/** @author Akash Yadav */
@@ -27,11 +26,11 @@ import com.itsaky.androidide.preferences.internal.useSoftTab
* '\t'.
*/
val indentationChar: Char
get() = if (useSoftTab) ' ' else '\t'
get() = if (EditorPreferences.useSoftTab) ' ' else '\t'
/** Get the string which should be used as indentation while generating code. */
val indentationString: String
get() = if (useSoftTab) " ".repeat(tabSize) else "\t"
get() = if (EditorPreferences.useSoftTab) " ".repeat(EditorPreferences.tabSize) else "\t"
/**
* Creates the indentation string for the given number of spaces. The result is simply
@@ -42,6 +41,6 @@ val indentationString: String
* @return The indentation string.
*/
fun indentationString(spaceCount: Int): String {
val count = if (useSoftTab) spaceCount else spaceCount / tabSize
val count = if (EditorPreferences.useSoftTab) spaceCount else spaceCount / EditorPreferences.tabSize
return indentationChar.toString().repeat(count)
}
@@ -1,81 +1,92 @@
package com.termux.shared.theme;
import static com.itsaky.androidide.preferences.internal.GeneralPreferencesKt.*;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import com.itsaky.androidide.preferences.internal.GeneralPreferences;
import com.itsaky.androidide.utils.ResourceUtilsKt;
public class ThemeUtils {
public static final int ATTR_TEXT_COLOR_PRIMARY = android.R.attr.textColorPrimary;
public static final int ATTR_TEXT_COLOR_SECONDARY = android.R.attr.textColorSecondary;
public static final int ATTR_TEXT_COLOR = android.R.attr.textColor;
public static final int ATTR_TEXT_COLOR_LINK = android.R.attr.textColorLink;
public static final int ATTR_TEXT_COLOR_PRIMARY = android.R.attr.textColorPrimary;
public static final int ATTR_TEXT_COLOR_SECONDARY = android.R.attr.textColorSecondary;
public static final int ATTR_TEXT_COLOR = android.R.attr.textColor;
public static final int ATTR_TEXT_COLOR_LINK = android.R.attr.textColorLink;
/**
* Will return true if system has enabled night mode.
* https://developer.android.com/guide/topics/resources/providing-resources#NightQualifier
*/
public static boolean isNightModeEnabled(Context context) {
if (context == null) return false;
return ResourceUtilsKt.isSystemInDarkMode(context);
/**
* Will return true if system has enabled night mode.
* https://developer.android.com/guide/topics/resources/providing-resources#NightQualifier
*/
public static boolean isNightModeEnabled(Context context) {
if (context == null) {
return false;
}
return ResourceUtilsKt.isSystemInDarkMode(context);
}
/** Will return true if mode is set to {@link NightMode#TRUE}, otherwise will return true if
* mode is set to {@link NightMode#SYSTEM} and night mode is enabled by system. */
public static boolean shouldEnableDarkTheme(Context context, String name) {
return getUiMode() == AppCompatDelegate.getDefaultNightMode() || isNightModeEnabled(context);
}
/**
* Will return true if mode is set to {@link NightMode#TRUE}, otherwise will return true if mode
* is set to {@link NightMode#SYSTEM} and night mode is enabled by system.
*/
public static boolean shouldEnableDarkTheme(Context context, String name) {
return GeneralPreferences.INSTANCE.getUiMode() == AppCompatDelegate.getDefaultNightMode()
|| isNightModeEnabled(context);
}
/** Get {@link #ATTR_TEXT_COLOR_PRIMARY} value being used by current theme. */
public static int getTextColorPrimary(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_PRIMARY);
}
/**
* Get {@link #ATTR_TEXT_COLOR_PRIMARY} value being used by current theme.
*/
public static int getTextColorPrimary(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_PRIMARY);
}
/** Get {@link #ATTR_TEXT_COLOR_SECONDARY} value being used by current theme. */
public static int getTextColorSecondary(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_SECONDARY);
}
/**
* Get {@link #ATTR_TEXT_COLOR_SECONDARY} value being used by current theme.
*/
public static int getTextColorSecondary(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_SECONDARY);
}
/** Get {@link #ATTR_TEXT_COLOR} value being used by current theme. */
public static int getTextColor(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR);
}
/**
* Get {@link #ATTR_TEXT_COLOR} value being used by current theme.
*/
public static int getTextColor(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR);
}
/** Get {@link #ATTR_TEXT_COLOR_LINK} value being used by current theme. */
public static int getTextColorLink(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_LINK);
}
/**
* Get {@link #ATTR_TEXT_COLOR_LINK} value being used by current theme.
*/
public static int getTextColorLink(Context context) {
return getSystemAttrColor(context, ATTR_TEXT_COLOR_LINK);
}
/**
* Wrapper for {@link #getSystemAttrColor(Context, int, int)} with {@code def} value {@code 0}.
*/
public static int getSystemAttrColor(Context context, int attr) {
return getSystemAttrColor(context, attr, 0);
}
/** Wrapper for {@link #getSystemAttrColor(Context, int, int)} with {@code def} value {@code 0}. */
public static int getSystemAttrColor(Context context, int attr) {
return getSystemAttrColor(context, attr, 0);
}
/**
* Get a values defined by the current heme listed in attrs.
*
* @param context The context for operations. It must be an instance of {@link Activity} or
* {@link AppCompatActivity} or one with which a theme attribute can be got.
* Do no use application context.
* @param attr The attr id.
* @param def The def value to return.
* @return Returns the {@code attr} value if found, otherwise {@code def}.
*/
public static int getSystemAttrColor(Context context, int attr, int def) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[] { attr });
int color = typedArray.getColor(0, def);
typedArray.recycle();
return color;
}
/**
* Get a values defined by the current heme listed in attrs.
*
* @param context The context for operations. It must be an instance of {@link Activity} or
* {@link AppCompatActivity} or one with which a theme attribute can be got. Do no
* use application context.
* @param attr The attr id.
* @param def The def value to return.
* @return Returns the {@code attr} value if found, otherwise {@code def}.
*/
public static int getSystemAttrColor(Context context, int attr, int def) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[]{attr});
int color = typedArray.getColor(0, def);
typedArray.recycle();
return color;
}
}
@@ -25,7 +25,7 @@ import com.itsaky.androidide.app.BaseIDEActivity
import com.itsaky.androidide.editor.language.treesitter.XMLLanguage
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
import com.itsaky.androidide.editor.ui.IDEEditor
import com.itsaky.androidide.preferences.internal.fontSize
import com.itsaky.androidide.preferences.internal.EditorPreferences
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE
import com.itsaky.androidide.uidesigner.databinding.ActivityShowXmlBinding
import com.itsaky.androidide.utils.flashInfo
@@ -67,7 +67,7 @@ class ShowXmlActivity : BaseIDEActivity() {
editor.typefaceText = jetbrainsMono()
editor.typefaceLineNumber = jetbrainsMono()
editor.setText(intent?.getStringExtra(KEY_XML) ?: "")
editor.setTextSize(fontSize)
editor.setTextSize(EditorPreferences.fontSize)
IDEColorSchemeProvider.readSchemeAsync(
context = this,