Skip to content

Commit c81869a

Browse files
authored
Merge branch 'stage' into feat/ADFA-2117-force-kts-for-compose-template
2 parents 2254f78 + aec95c2 commit c81869a

16 files changed

Lines changed: 170 additions & 64 deletions

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,7 @@ tests/test-home
128128
/sample-plugin/build/
129129
/keystore-generator-plugin/build/
130130
/keystore-generator-plugin/.kotlin/
131+
**/build
132+
133+
# Release files
134+
*.zim

app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ class MainActivity : EdgeToEdgeIDEActivity() {
307307

308308
internal fun openProject(root: File) {
309309
ProjectManagerImpl.getInstance().projectPath = root.absolutePath
310+
GeneralPreferences.lastOpenedProject = root.absolutePath
310311

311312
// Track project open in Firebase Analytics
312313
analyticsManager.trackProjectOpened(root.absolutePath)

app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,11 @@ abstract class BaseEditorActivity :
576576
}
577577

578578
feedbackButtonManager =
579-
FeedbackButtonManager(activity = this, feedbackFab = binding.fabFeedback)
579+
FeedbackButtonManager(
580+
activity = this,
581+
feedbackFab = binding.fabFeedback,
582+
getLogContent = ::getLogContent,
583+
)
580584
feedbackButtonManager?.setupDraggableFab()
581585

582586
setupMemUsageChart()
@@ -1280,17 +1284,25 @@ abstract class BaseEditorActivity :
12801284
}
12811285

12821286
private fun getLogContent(): String? {
1283-
if (bottomSheetViewModel.sheetBehaviorState == BottomSheetBehavior.STATE_COLLAPSED) {
1284-
return null
1287+
val pagerAdapter = binding.content.bottomSheet.pagerAdapter
1288+
1289+
val candidateTabs = buildList {
1290+
add(bottomSheetViewModel.currentTab)
1291+
add(BottomSheetViewModel.TAB_BUILD_OUTPUT)
1292+
add(BottomSheetViewModel.TAB_APPLICATION_LOGS)
1293+
add(BottomSheetViewModel.TAB_IDE_LOGS)
1294+
}.distinct()
1295+
1296+
candidateTabs.forEach { tabIndex ->
1297+
val fragment = pagerAdapter.getFragmentAtIndex<Fragment>(tabIndex)
1298+
if (fragment is ShareableOutputFragment) {
1299+
val shareable = fragment.getShareableContent().trim()
1300+
if (shareable.isNotEmpty()) {
1301+
return shareable
1302+
}
1303+
}
12851304
}
12861305

1287-
val fragment = this.binding.content.bottomSheet.pagerAdapter.getFragmentAtIndex<Fragment>(
1288-
bottomSheetViewModel.currentTab
1289-
)
1290-
1291-
return when (fragment) {
1292-
is ShareableOutputFragment -> fragment.getShareableContent()
1293-
else -> null
1294-
}
1306+
return null
12951307
}
12961308
}

app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,8 +1187,6 @@ open class EditorHandlerActivity :
11871187
(content.editorContainer.getChildAt(i) as? CodeEditorView)?.editor?.markUnmodified()
11881188
}
11891189

1190-
GeneralPreferences.lastOpenedProject = GeneralPreferences.NO_OPENED_PROJECT
1191-
11921190
performCloseAllFiles(manualFinish = true)
11931191
}
11941192

@@ -1197,7 +1195,6 @@ open class EditorHandlerActivity :
11971195
dialog.dismiss()
11981196

11991197
saveAllAsync(notify = false) {
1200-
GeneralPreferences.lastOpenedProject = GeneralPreferences.NO_OPENED_PROJECT
12011198

12021199
runOnUiThread {
12031200
performCloseAllFiles(manualFinish = true)

app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import com.itsaky.androidide.idetooltips.TooltipTag
5050
import com.itsaky.androidide.lookup.Lookup
5151
import com.itsaky.androidide.lsp.IDELanguageClientImpl
5252
import com.itsaky.androidide.lsp.java.utils.CancelChecker
53-
import com.itsaky.androidide.preferences.internal.GeneralPreferences
5453
import com.itsaky.androidide.projects.ProjectManagerImpl
5554
import com.itsaky.androidide.projects.builder.BuildService
5655
import com.itsaky.androidide.projects.models.projectDir
@@ -770,7 +769,6 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
770769

771770
private fun initialSetup() {
772771
val manager = ProjectManagerImpl.getInstance()
773-
GeneralPreferences.lastOpenedProject = manager.projectDirPath
774772
try {
775773
val project = manager.workspace?.rootProject
776774
if (project == null) {

app/src/main/java/com/itsaky/androidide/adapters/EditorBottomSheetTabAdapter.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -107,20 +107,20 @@ class EditorBottomSheetTabAdapter(
107107
title = fragmentActivity.getString(R.string.debugger_title),
108108
fragmentClass = DebuggerFragment::class.java,
109109
itemId = TAB_DEBUGGER,
110-
tooltipTag = TooltipTag.PROJECT_DEBUGGER_OUTPUT,
111-
),
112-
)
113-
114-
if (isExperimentsEnabled()) {
115-
add(
116-
Tab(
117-
title = fragmentActivity.getString(R.string.title_agent),
118-
fragmentClass = AgentFragmentContainer::class.java,
119-
itemId = TAB_AGENT,
120-
tooltipTag = TooltipTag.PROJECT_AGENT,
121-
),
122-
)
123-
}
110+
tooltipTag = TooltipTag.PROJECT_DEBUGGER_OUTPUT,
111+
),
112+
)
113+
114+
if (isExperimentsEnabled()) {
115+
add(
116+
Tab(
117+
title = fragmentActivity.getString(R.string.title_agent),
118+
fragmentClass = AgentFragmentContainer::class.java,
119+
itemId = TAB_AGENT,
120+
tooltipTag = TooltipTag.PROJECT_AGENT,
121+
),
122+
)
123+
}
124124
}
125125

126126
private val tabs = MutableList(allTabs.size) { allTabs[it] }

app/src/main/java/com/itsaky/androidide/agent/fragments/AgentFragmentContainer.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.itsaky.androidide.agent.fragments
22

3+
import android.content.Context
34
import android.os.Bundle
45
import android.view.View
6+
import androidx.core.content.edit
57
import com.itsaky.androidide.databinding.FragmentAgentContainerBinding
68
import com.itsaky.androidide.fragments.EmptyStateFragment
79

10+
internal const val PREFS_NAME = "LlamaPrefs"
11+
private const val DISCLAIMER_SHOWN_KEY = "disclaimer_shown"
12+
813
class AgentFragmentContainer : EmptyStateFragment<FragmentAgentContainerBinding>(FragmentAgentContainerBinding::inflate) {
914
override fun onFragmentLongPressed() {
1015
}
@@ -16,5 +21,19 @@ class AgentFragmentContainer : EmptyStateFragment<FragmentAgentContainerBinding>
1621
super.onViewCreated(view, savedInstanceState)
1722
emptyStateViewModel.setEmptyMessage("No git actions yet")
1823
emptyStateViewModel.setEmpty(false)
24+
showDisclaimerDialogIfNeeded()
25+
}
26+
27+
private fun showDisclaimerDialogIfNeeded() {
28+
val prefs = requireActivity().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
29+
val disclaimerShown = prefs.getBoolean(DISCLAIMER_SHOWN_KEY, false)
30+
31+
if (!disclaimerShown) {
32+
DisclaimerDialogFragment().show(childFragmentManager, "DisclaimerDialogFragment")
33+
34+
prefs.edit {
35+
putBoolean(DISCLAIMER_SHOWN_KEY, true)
36+
}
37+
}
1938
}
2039
}

app/src/main/java/com/itsaky/androidide/agent/fragments/AiSettingsFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import java.util.Locale
3131

3232

3333
const val SAVED_MODEL_URI_KEY = "saved_model_uri"
34-
private const val PREFS_NAME = "LlamaPrefs"
3534

3635
class AiSettingsFragment : Fragment(R.layout.fragment_ai_settings) {
3736

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.itsaky.androidide.agent.fragments
2+
3+
import android.app.Dialog
4+
import android.os.Bundle
5+
import androidx.fragment.app.DialogFragment
6+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
7+
import com.itsaky.androidide.resources.R
8+
9+
class DisclaimerDialogFragment : DialogFragment() {
10+
11+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
12+
return MaterialAlertDialogBuilder(requireContext())
13+
.setTitle(getString(R.string.ai_disclaimer))
14+
.setMessage(getString(R.string.ai_disclaimer_message))
15+
.setPositiveButton("OK", null)
16+
.create()
17+
}
18+
}

app/src/main/java/com/itsaky/androidide/fragments/RecentProjectsFragment.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.itsaky.androidide.utils.flashError
2525
import com.itsaky.androidide.utils.viewLifecycleScope
2626
import com.itsaky.androidide.viewmodel.MainViewModel
2727
import com.itsaky.androidide.viewmodel.RecentProjectsViewModel
28+
import com.itsaky.androidide.preferences.internal.GeneralPreferences
2829
import io.sentry.Sentry
2930
import kotlinx.coroutines.Dispatchers
3031
import kotlinx.coroutines.joinAll
@@ -53,7 +54,7 @@ class RecentProjectsFragment : BaseFragment() {
5354
setupRecyclerView()
5455
setupObservers()
5556
setupClickListeners()
56-
bootstrapFromFixedFolderIfNeeded(autoOpenFirst = true)
57+
bootstrapFromFixedFolderIfNeeded()
5758
}
5859

5960
private fun setupRecyclerView() {
@@ -65,7 +66,7 @@ class RecentProjectsFragment : BaseFragment() {
6566

6667
private fun File.isProjectCandidateDir(): Boolean = isDirectory && canRead() && !name.startsWith(".") && !isHidden
6768

68-
private fun bootstrapFromFixedFolderIfNeeded(autoOpenFirst: Boolean) {
69+
private fun bootstrapFromFixedFolderIfNeeded() {
6970
if (viewModel.didBootstrap) return
7071
viewModel.didBootstrap = true
7172

@@ -76,8 +77,23 @@ class RecentProjectsFragment : BaseFragment() {
7677

7778
loadProjectsIntoViewModel(validProjects)
7879

79-
if (autoOpenFirst) withContext(Dispatchers.Main) {
80-
openProject(validProjects.first())
80+
if (GeneralPreferences.autoOpenProjects) {
81+
val lastOpenedPath = GeneralPreferences.lastOpenedProject
82+
83+
val projectToOpen = validProjects.find {
84+
it.absolutePath == lastOpenedPath
85+
}
86+
87+
if (projectToOpen != null) {
88+
withContext(Dispatchers.Main) { openProject(projectToOpen) }
89+
return@launch
90+
}
91+
92+
val lastCreated = validProjects.maxByOrNull { it.lastModified() }
93+
94+
if (lastCreated != null) {
95+
withContext(Dispatchers.Main) { openProject(lastCreated) }
96+
}
8197
}
8298
} catch (e: Throwable) {
8399
Sentry.captureException(e)

0 commit comments

Comments
 (0)