Skip to content

Commit 729a697

Browse files
authored
v1.29 (43)
v1.29 (43) - Android + GTK: Make file list sortable and searchable - Android + GTK: Make SolidMapDirectory less confusing - Android: Check for Bluetooth permissions - GTK: List summary in detail view and as map overlay - GTK: Responsive about dialog - GTK: Responsive file operation dialogs - GTK: Responsive preferences dialog - GTK: Improve preferences dialog - GTK: Responsive file dialog
2 parents 953c92f + c0a975b commit 729a697

File tree

235 files changed

+3248
-2748
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

235 files changed

+3248
-2748
lines changed

aat-android/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ android {
2525
targetSdk = 33
2626

2727
// Version Code can not be taken from from variable (f-droid version checker fail)
28-
versionCode = 42
28+
versionCode = 43
2929
versionName = appVersionName
3030
applicationId = appId
3131
}

aat-android/src/main/kotlin/ch/bailu/aat/activities/AbsFileContentActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ abstract class AbsFileContentActivity : ActivityContext(), View.OnClickListener
121121
if (v === previousFile || v === nextFile) {
122122
changeFileAsk(v)
123123
} else if (v === fileOperation) {
124-
currentFile?.apply { FileMenu(this@AbsFileContentActivity, info.getFile()).showAsPopup(this@AbsFileContentActivity, v) }
124+
currentFile?.apply { FileMenu(this@AbsFileContentActivity, getInfo().getFile()).showAsPopup(this@AbsFileContentActivity, v) }
125125
}
126126
}
127127

Lines changed: 26 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,29 @@
11
package ch.bailu.aat.activities
22

3-
import android.content.res.Configuration
43
import android.os.Bundle
54
import android.view.View
5+
import android.view.WindowManager
66
import android.widget.AdapterView
77
import android.widget.AdapterView.OnItemClickListener
8-
import android.widget.LinearLayout
9-
import ch.bailu.aat.R
10-
import ch.bailu.aat.map.MapFactory
11-
import ch.bailu.aat.map.To
128
import ch.bailu.aat.map.layer.FileControlBarLayer
139
import ch.bailu.aat.preferences.Storage
14-
import ch.bailu.aat.util.ui.AppLayout
1510
import ch.bailu.aat.util.ui.theme.AppTheme
1611
import ch.bailu.aat.util.ui.theme.UiTheme
17-
import ch.bailu.aat.views.bar.MainControlBar
1812
import ch.bailu.aat.views.busy.BusyViewControlDbSync
19-
import ch.bailu.aat.views.description.mview.MultiView
20-
import ch.bailu.aat.views.layout.ContentView
21-
import ch.bailu.aat.views.layout.PercentageLayout
13+
import ch.bailu.aat.views.list.GpxListActivityContentView
14+
import ch.bailu.aat.views.list.GpxListFilterView
2215
import ch.bailu.aat.views.list.GpxListView
23-
import ch.bailu.aat.views.preferences.TitleView
24-
import ch.bailu.aat.views.preferences.VerticalScrollView
2516
import ch.bailu.aat_lib.description.ContentDescription
26-
import ch.bailu.aat_lib.description.PathDescription
2717
import ch.bailu.aat_lib.dispatcher.TargetInterface
2818
import ch.bailu.aat_lib.dispatcher.source.CurrentLocationSource
2919
import ch.bailu.aat_lib.dispatcher.source.IteratorSource
3020
import ch.bailu.aat_lib.dispatcher.source.addOverlaySources
21+
import ch.bailu.aat_lib.dispatcher.usage.UsageTrackerAlwaysEnabled
3122
import ch.bailu.aat_lib.dispatcher.usage.UsageTrackers
32-
import ch.bailu.aat_lib.gpx.information.InfoID
3323
import ch.bailu.aat_lib.gpx.information.InformationUtil
34-
import ch.bailu.aat_lib.map.MapViewInterface
3524
import ch.bailu.aat_lib.preferences.OnPreferencesChanged
36-
import ch.bailu.aat_lib.preferences.SolidDirectoryQuery
3725
import ch.bailu.aat_lib.preferences.StorageInterface
26+
import ch.bailu.aat_lib.preferences.file_list.SolidDirectoryQuery
3827
import ch.bailu.aat_lib.service.directory.Iterator
3928
import ch.bailu.aat_lib.service.directory.IteratorSimple
4029
import ch.bailu.foc.Foc
@@ -44,12 +33,12 @@ abstract class AbsGpxListActivity : ActivityContext(), OnItemClickListener, OnPr
4433
private val theme: UiTheme = AppTheme.trackList
4534
private val filterTheme: UiTheme = AppTheme.filter
4635

47-
private var solidKey: String = ""
4836
private var iteratorSimple = Iterator.NULL
4937
private var sdirectory: SolidDirectoryQuery? = null
5038
private var listView: GpxListView? = null
5139
private var fileControlBar: FileControlBarLayer? = null
5240
private var busyControl: BusyViewControlDbSync? = null
41+
private var listFilterView: GpxListFilterView? = null
5342

5443
abstract fun displayFile()
5544

@@ -62,25 +51,29 @@ abstract class AbsGpxListActivity : ActivityContext(), OnItemClickListener, OnPr
6251
override fun onCreate(savedInstanceState: Bundle?) {
6352
super.onCreate(savedInstanceState)
6453

65-
sdirectory = SolidDirectoryQuery(Storage(this), FocAndroidFactory(this)).apply {
54+
val sdirectory = SolidDirectoryQuery(Storage(this), FocAndroidFactory(this)).apply {
6655
setValue(directory.path)
67-
solidKey = "${AbsGpxListActivity::class.java.simpleName}_${this.getValueAsString()}"
6856
}
57+
this.sdirectory = sdirectory
6958

70-
setContentView(Layouter().contentView)
71-
createDispatcher()
59+
val contentView = GpxListActivityContentView(this, sdirectory, theme, filterTheme)
60+
busyControl = contentView.busyControl
61+
listView = contentView.listView
62+
fileControlBar = contentView.fileControlBar
63+
listFilterView = contentView.listFilterView
64+
65+
setContentView(contentView.contentView)
66+
createDispatcher(contentView.busyControl)
67+
68+
// Disable keyboard
69+
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
7270
}
7371

74-
private fun createDispatcher() {
75-
dispatcher.addSource(IteratorSource.Summary(appContext))
72+
private fun createDispatcher(busyControl: TargetInterface) {
73+
dispatcher.addSource(IteratorSource.Summary(appContext, UsageTrackerAlwaysEnabled()))
7674
dispatcher.addOverlaySources(appContext, UsageTrackers().createOverlayUsageTracker(appContext.storage, *InformationUtil.getOverlayInfoIdList().toIntArray()))
7775
dispatcher.addSource(CurrentLocationSource(appContext.services, appContext.broadcaster))
78-
79-
val busyControl = busyControl
80-
81-
if (busyControl is TargetInterface) {
82-
dispatcher.addTarget(busyControl, *InformationUtil.getOverlayInfoIdList().toIntArray())
83-
}
76+
dispatcher.addTarget(busyControl, *InformationUtil.getOverlayInfoIdList().toIntArray())
8477
}
8578

8679
override fun onResumeWithService() {
@@ -90,7 +83,7 @@ abstract class AbsGpxListActivity : ActivityContext(), OnItemClickListener, OnPr
9083
sdirectory?.apply {
9184
listView?.setSelection(position.getValue())
9285
register(this@AbsGpxListActivity)
93-
setListBackgroundColor(createSelectionString().isNotEmpty())
86+
setListBackgroundColor(isFilterEnabled())
9487
}
9588

9689
super.onResumeWithService()
@@ -122,96 +115,18 @@ abstract class AbsGpxListActivity : ActivityContext(), OnItemClickListener, OnPr
122115
override fun onPreferencesChanged(storage: StorageInterface, key: String) {
123116
sdirectory?.apply {
124117
if (containsKey(key)) {
125-
setListBackgroundColor(createSelectionString().isNotEmpty())
118+
setListBackgroundColor(isFilterEnabled())
126119
}
127120
}
128121
}
129122

130123
private fun setListBackgroundColor(hasFilter: Boolean) {
131124
if (hasFilter) {
132125
listView?.themify(filterTheme)
126+
listFilterView?.themify(filterTheme)
133127
} else {
134128
listView?.themify(theme)
135-
}
136-
}
137-
138-
private inner class Layouter {
139-
private val acontext = this@AbsGpxListActivity
140-
private val summaryLabel = getString(R.string.label_summary)
141-
private val filterLabel = getString(R.string.label_filter)
142-
private val mapLabel = getString(R.string.intro_map)
143-
private val listLabel = getString(R.string.label_list)
144-
145-
val contentView = ContentView(acontext, theme)
146-
147-
init {
148-
listView = GpxListView(
149-
acontext,
150-
gpxListItemData
151-
).apply {
152-
onItemClickListener = acontext
153-
}
154-
155-
registerForContextMenu(listView)
156-
busyControl = BusyViewControlDbSync(contentView)
157-
val map: MapViewInterface = MapFactory.createDefaultMapView(acontext, solidKey).list()
158-
159-
fileControlBar = FileControlBarLayer(appContext, map.getMContext(), acontext, appContext.summaryConfig).apply {
160-
map.add(this)
161-
}
162-
163-
164-
val summary = VerticalScrollView(acontext)
165-
summary.add(TitleView(acontext, label, theme))
166-
summary.add(dispatcher, PathDescription(), theme, InfoID.LIST_SUMMARY)
167-
summary.add(TitleView(acontext, summaryLabel, theme))
168-
summary.addAllContent(dispatcher, summaryData, theme, InfoID.LIST_SUMMARY)
169-
val title = TitleView(acontext, filterLabel, filterTheme)
170-
summary.add(title)
171-
summary.addAllFilterViews(map.getMContext(), filterTheme)
172-
val bar = MainControlBar(acontext)
173-
val layout = createLayout(map, summary, bar)
174-
contentView.add(bar)
175-
contentView.add(layout)
176-
}
177-
178-
private fun createLayout(map: MapViewInterface, summary: VerticalScrollView, bar: MainControlBar): View {
179-
return if (AppLayout.isTablet(acontext)) {
180-
createTabletLayout(map, summary)
181-
} else {
182-
createMvLayout(map, summary, bar)
183-
}
184-
}
185-
186-
private fun createMvLayout(map: MapViewInterface, summary: VerticalScrollView, bar: MainControlBar): View {
187-
val multiView = MultiView(acontext, solidKey)
188-
189-
multiView.add(listView!!, listLabel)
190-
To.view(map)?.apply { multiView.add(this, mapLabel) }
191-
multiView.add(summary, "$summaryLabel/$filterLabel")
192-
bar.addAll(multiView)
193-
contentView.addMvIndicator(multiView)
194-
return multiView
195-
}
196-
197-
private fun createTabletLayout(map: MapViewInterface, summary: VerticalScrollView): View {
198-
return if (AppLayout.getOrientation(acontext) == Configuration.ORIENTATION_LANDSCAPE) {
199-
val a = PercentageLayout(acontext)
200-
a.setOrientation(LinearLayout.HORIZONTAL)
201-
a.add(listView!!, 30)
202-
a.add(summary, 30)
203-
a.add(To.view(map)!!, 40)
204-
a
205-
} else {
206-
val a = PercentageLayout(acontext)
207-
a.setOrientation(LinearLayout.HORIZONTAL)
208-
a.add(listView!!, 50)
209-
a.add(summary, 50)
210-
val b = PercentageLayout(acontext)
211-
b.add(a, 60)
212-
b.add(To.view(map)!!, 40)
213-
b
214-
}
129+
listFilterView?.themify(theme)
215130
}
216131
}
217132
}

aat-android/src/main/kotlin/ch/bailu/aat/activities/MainActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import android.os.Bundle
44
import android.view.View
55
import android.widget.LinearLayout
66
import ch.bailu.aat.app.ActivitySwitcher
7-
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectoryDefault
7+
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectory
88
import ch.bailu.aat.preferences.system.SolidExternalDirectory
99
import ch.bailu.aat.util.ui.AppLayout
1010
import ch.bailu.aat.util.ui.theme.AppTheme
@@ -133,7 +133,7 @@ class MainActivity : ActivityContext() {
133133
}
134134

135135
private inner class PresetDirectoryLabel(s: ActivitySwitcher.Entry) : ActivityLabel(s), OnPreferencesChanged {
136-
private val sdirectory = SolidDataDirectory(AndroidSolidDataDirectoryDefault(context), FocAndroidFactory(context))
136+
private val sdirectory = AndroidSolidDataDirectory(context)
137137
private val spreset: SolidPreset = SolidPreset(appContext.storage)
138138

139139
init {
@@ -164,7 +164,7 @@ class MainActivity : ActivityContext() {
164164

165165
private inner class InternalDirectoryLabel(s: ActivitySwitcher.Entry, private val directory: String) :
166166
ActivityLabel(s), OnPreferencesChanged {
167-
private val sdirectory = SolidDataDirectory(AndroidSolidDataDirectoryDefault(context), FocAndroidFactory(context))
167+
private val sdirectory = AndroidSolidDataDirectory(context)
168168

169169
fun setText() {
170170
setText(AppDirectory.getDataDirectory(sdirectory, directory).pathName)

aat-android/src/main/kotlin/ch/bailu/aat/activities/OverlayListActivity.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ package ch.bailu.aat.activities
22

33
import android.content.Intent
44
import ch.bailu.aat.R
5-
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectoryDefault
5+
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectory
66
import ch.bailu.aat_lib.description.ContentDescription
77
import ch.bailu.aat_lib.description.DateDescription
88
import ch.bailu.aat_lib.description.DistanceDescription
99
import ch.bailu.aat_lib.description.NameDescription
1010
import ch.bailu.aat_lib.description.TrackSizeDescription
11-
import ch.bailu.aat_lib.preferences.system.SolidDataDirectory
1211
import ch.bailu.aat_lib.util.fs.AppDirectory
1312
import ch.bailu.foc.Foc
14-
import ch.bailu.foc_android.FocAndroidFactory
1513

1614
class OverlayListActivity : AbsGpxListActivity() {
1715
override val gpxListItemData: Array<ContentDescription>
@@ -32,7 +30,7 @@ class OverlayListActivity : AbsGpxListActivity() {
3230

3331
override val directory: Foc
3432
get() = AppDirectory.getDataDirectory(
35-
SolidDataDirectory(AndroidSolidDataDirectoryDefault(this), FocAndroidFactory(this)),
33+
AndroidSolidDataDirectory(this),
3634
AppDirectory.DIR_OVERLAY
3735
)
3836
override val label: String

aat-android/src/main/kotlin/ch/bailu/aat/activities/TrackListActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ch.bailu.aat.activities
22

33
import android.content.Intent
44
import ch.bailu.aat.R
5-
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectoryDefault
5+
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectory
66
import ch.bailu.aat_lib.description.AverageSpeedDescription
77
import ch.bailu.aat_lib.description.ContentDescription
88
import ch.bailu.aat_lib.description.DateDescriptionCompact
@@ -40,7 +40,7 @@ class TrackListActivity : AbsGpxListActivity() {
4040
}
4141

4242
override val directory: Foc
43-
get() = SolidPreset(appContext.storage).getDirectory(SolidDataDirectory(AndroidSolidDataDirectoryDefault(this), FocAndroidFactory(this)))
43+
get() = SolidPreset(appContext.storage).getDirectory(AndroidSolidDataDirectory(this))
4444
override val label: String
4545
get() = getString(R.string.intro_list)
4646
}

aat-android/src/main/kotlin/ch/bailu/aat/app/AndroidAppContext.kt

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import ch.bailu.aat.preferences.Storage
88
import ch.bailu.aat.preferences.map.AndroidMapDirectories
99
import ch.bailu.aat.preferences.map.AndroidSolidDem3Directory
1010
import ch.bailu.aat.preferences.map.AndroidSolidTileCacheDirectory
11-
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectoryDefault
11+
import ch.bailu.aat.preferences.system.AndroidSolidDataDirectory
1212
import ch.bailu.aat.services.directory.AndroidSummaryConfig
1313
import ch.bailu.aat.util.AndroidTimer
1414
import ch.bailu.aat.util.graphic.AndroidSyncTileBitmap
@@ -19,15 +19,14 @@ import ch.bailu.aat_lib.map.TilePainter
1919
import ch.bailu.aat_lib.map.tile.MapTileInterface
2020
import ch.bailu.aat_lib.preferences.StorageInterface
2121
import ch.bailu.aat_lib.preferences.map.SolidDem3Directory
22-
import ch.bailu.aat_lib.preferences.map.SolidMapsForgeDirectory
2322
import ch.bailu.aat_lib.preferences.map.SolidTileCacheDirectory
2423
import ch.bailu.aat_lib.preferences.system.SolidDataDirectory
2524
import ch.bailu.aat_lib.service.ServicesInterface
2625
import ch.bailu.aat_lib.service.background.DownloadConfig
2726
import ch.bailu.aat_lib.service.directory.MapPreviewInterface
2827
import ch.bailu.aat_lib.service.directory.SummaryConfig
2928
import ch.bailu.aat_lib.util.Timer
30-
import ch.bailu.aat_lib.util.sql.DbConnection
29+
import ch.bailu.aat_lib.util.sql.DbConnectionInterface
3130
import ch.bailu.foc.Foc
3231
import ch.bailu.foc_android.FocAndroidFactory
3332
import ch.bailu.foc_android.FocAssetFactory
@@ -38,14 +37,13 @@ class AndroidAppContext(private val context: Context, override val services: Ser
3837
override val broadcaster = AndroidBroadcaster(context)
3938
override val assets = FocAssetFactory(context)
4039

41-
4240
override val storage: StorageInterface
4341
get() = Storage(context)
4442

4543
override val summaryConfig: SummaryConfig
4644
get() = AndroidSummaryConfig(context)
4745

48-
override fun createDataBase(): DbConnection {
46+
override fun createDataBase(): DbConnectionInterface {
4947
return AndroidDbConnection(context)
5048
}
5149

@@ -65,12 +63,9 @@ class AndroidAppContext(private val context: Context, override val services: Ser
6563

6664

6765
override val dataDirectory: SolidDataDirectory
68-
get() = SolidDataDirectory(AndroidSolidDataDirectoryDefault(context), FocAndroidFactory(context))
69-
70-
71-
override val mapDirectory: SolidMapsForgeDirectory
72-
get() = AndroidMapDirectories(context).createSolidDirectory()
66+
get() = AndroidSolidDataDirectory(context)
7367

68+
override val mapDirectories by lazy { AndroidMapDirectories(context) }
7469

7570
override val tileCacheDirectory: SolidTileCacheDirectory
7671
get() = AndroidSolidTileCacheDirectory(context)
@@ -82,7 +77,6 @@ class AndroidAppContext(private val context: Context, override val services: Ser
8277
override val tilePainter: TilePainter
8378
get() = AndroidTilePainter()
8479

85-
8680
override fun getPoiPersistenceManager(poiDatabase: String): PoiPersistenceManager {
8781
return AndroidPoiPersistenceManagerFactory.getPoiPersistenceManager(poiDatabase)
8882
}

aat-android/src/main/kotlin/ch/bailu/aat/map/layer/FileControlBarLayer.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import ch.bailu.aat_lib.gpx.GpxPointNode
2323
import ch.bailu.aat_lib.gpx.information.InfoID
2424
import ch.bailu.aat_lib.map.MapContext
2525
import ch.bailu.aat_lib.map.edge.Position
26-
import ch.bailu.aat_lib.preferences.SolidDirectoryQuery
26+
import ch.bailu.aat_lib.preferences.file_list.SolidDirectoryQuery
2727
import ch.bailu.aat_lib.preferences.StorageInterface
2828
import ch.bailu.aat_lib.preferences.map.SolidCustomOverlay
2929
import ch.bailu.aat_lib.service.directory.Iterator
@@ -131,14 +131,14 @@ class FileControlBarLayer(
131131
super.setSelectedNode(iid, info, node, index)
132132
SolidDirectoryQuery(Storage(acontext), FocAndroidFactory(acontext)).position.setValue(index)
133133
iterator.moveToPosition(index)
134-
selectedFile = iterator.info.getFile()
134+
selectedFile = iterator.getInfo().getFile()
135135
val file = selectedFile
136136
if (file is Foc) {
137137
preview.setFilePath(file)
138138
}
139-
markupBuilder.appendHeader(iterator.info.getFile().name)
139+
markupBuilder.appendHeader(iterator.getInfo().getFile().name)
140140
for (d in summaryData) {
141-
d.onContentUpdated(iterator.infoID, iterator.info)
141+
d.onContentUpdated(iterator.getInfoID(), iterator.getInfo())
142142
markupBuilder.appendNl(d)
143143
}
144144
setHtmlText(markupBuilder)

0 commit comments

Comments
 (0)