Skip to content

Commit 772e3fb

Browse files
committed
MetaDataCustomizer screen
1 parent bfe5056 commit 772e3fb

File tree

14 files changed

+310
-9
lines changed

14 files changed

+310
-9
lines changed

app/src/main/java/nl/giejay/android/tv/immich/screensaver/ScreenSaverService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ class ScreenSaverService : DreamService(), MediaSliderListener {
212212
}
213213

214214
override fun onButtonPressed(event: KeyEvent): Boolean {
215-
if(event.keyCode == KeyEvent.KEYCODE_DPAD_CENTER || event.keyCode == KeyEvent.KEYCODE_ENTER && !mediaSliderView.isControllerVisible()){
215+
if((event.keyCode == KeyEvent.KEYCODE_DPAD_CENTER || event.keyCode == KeyEvent.KEYCODE_ENTER) && !mediaSliderView.isControllerVisible()){
216216
finish()
217217
return true
218218
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package nl.giejay.android.tv.immich.settings
2+
3+
import android.content.Context
4+
import android.view.Gravity
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import android.widget.BaseAdapter
9+
import android.widget.ImageButton
10+
import android.widget.LinearLayout
11+
import android.widget.TextView
12+
import nl.giejay.android.tv.immich.R
13+
import nl.giejay.mediaslider.adapter.AlignOption
14+
import nl.giejay.mediaslider.adapter.MetaDataClock
15+
import nl.giejay.mediaslider.adapter.MetaDataItem
16+
import nl.giejay.mediaslider.adapter.MetaDataMediaCount
17+
import nl.giejay.mediaslider.adapter.MetaDataSliderItem
18+
import java.util.Collections
19+
20+
class MetaDataCustomizerAdapter(val context: Context, val metaData: MutableList<MetaDataItem>) : BaseAdapter() {
21+
private val layoutInflater: LayoutInflater = LayoutInflater.from(context)
22+
23+
override fun getCount(): Int {
24+
return metaData.size
25+
}
26+
27+
override fun getItem(p0: Int): Any {
28+
return metaData[p0]
29+
}
30+
31+
override fun isEnabled(position: Int): Boolean {
32+
return false
33+
}
34+
35+
override fun areAllItemsEnabled(): Boolean {
36+
return false
37+
}
38+
39+
override fun getItemId(p0: Int): Long {
40+
return 0
41+
}
42+
43+
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
44+
val metaDataItem = getItem(p0) as MetaDataItem
45+
val item: LinearLayout = layoutInflater.inflate(R.layout.fragment_metadata_item, null) as LinearLayout
46+
val textView = item.findViewById<TextView>(R.id.meta_data_customizer_text_view)
47+
if (metaDataItem.align == AlignOption.RIGHT) {
48+
val layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
49+
layoutParams.gravity = Gravity.END
50+
item.gravity = Gravity.END
51+
item.layoutParams = layoutParams
52+
}
53+
54+
item.findViewById<ImageButton>(R.id.delete_meta_data).setOnClickListener{
55+
this.metaData.remove(metaDataItem)
56+
notifyDataSetChanged()
57+
}
58+
59+
item.findViewById<ImageButton>(R.id.down_meta_data).setOnClickListener{
60+
val index = this.metaData.indexOf(metaDataItem)
61+
if(index + 1 < this.metaData.size){
62+
Collections.swap(this.metaData, index, index + 1)
63+
}
64+
notifyDataSetChanged()
65+
}
66+
item.findViewById<ImageButton>(R.id.up_meta_data).setOnClickListener{
67+
val index = this.metaData.indexOf(metaDataItem)
68+
if(index != 0){
69+
Collections.swap(this.metaData, index, index - 1)
70+
}
71+
notifyDataSetChanged()
72+
}
73+
74+
textView.text = when(metaDataItem){
75+
is MetaDataClock -> "Clock"
76+
is MetaDataMediaCount -> "Media Count"
77+
is MetaDataSliderItem -> metaDataItem.metaDataType.toString().lowercase().capitalize()
78+
}
79+
return item
80+
}
81+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package nl.giejay.android.tv.immich.settings
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import android.widget.ListView
8+
import androidx.fragment.app.Fragment
9+
import nl.giejay.android.tv.immich.R
10+
import nl.giejay.android.tv.immich.shared.prefs.PreferenceManager
11+
import nl.giejay.mediaslider.adapter.AlignOption
12+
import nl.giejay.mediaslider.adapter.MetaDataItem
13+
14+
class MetaDataCustomizerFragment : Fragment() {
15+
private var leftMetaData = mutableListOf<MetaDataItem>()
16+
private var rightMetaData = mutableListOf<MetaDataItem>()
17+
18+
override fun onCreateView(
19+
inflater: LayoutInflater,
20+
container: ViewGroup?,
21+
savedInstanceState: Bundle?
22+
): View? {
23+
val view = inflater.inflate(R.layout.fragment_metadata, container, false)
24+
val left = view.findViewById<ListView>(R.id.metadata_customizer_view_left)
25+
val right = view.findViewById<ListView>(R.id.metadata_customizer_view_right)
26+
val viewMetaData = PreferenceManager.getViewMetaData()
27+
this.leftMetaData = viewMetaData.filter { it.align == AlignOption.LEFT }.toMutableList()
28+
this.rightMetaData = viewMetaData.filter { it.align == AlignOption.RIGHT }.toMutableList()
29+
left.adapter = MetaDataCustomizerAdapter(requireContext(), leftMetaData)
30+
right.adapter = MetaDataCustomizerAdapter(requireContext(), rightMetaData)
31+
return view
32+
}
33+
34+
override fun onDestroyView() {
35+
super.onDestroyView()
36+
37+
}
38+
}

app/src/main/java/nl/giejay/android/tv/immich/shared/prefs/Preferences.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import androidx.preference.Preference
1313
import nl.giejay.android.tv.immich.R
1414
import nl.giejay.android.tv.immich.album.SelectionType
1515
import nl.giejay.android.tv.immich.screensaver.ScreenSaverType
16+
import nl.giejay.android.tv.immich.settings.MetaDataCustomizerFragment
17+
import nl.giejay.android.tv.immich.settings.MetaDataCustomizerFragmentDirections
1618
import nl.giejay.android.tv.immich.settings.ScreenSaverSettingsFragmentDirections
1719
import nl.giejay.mediaslider.transformations.GlideTransformations
1820

@@ -130,11 +132,9 @@ data object SLIDER_SHOW_MEDIA_COUNT : BooleanPref(true, "Show media count", "Sho
130132
data object SLIDER_SHOW_DATE : BooleanPref(false, "Show date", "Show date of asset in slideshow")
131133
data object SLIDER_SHOW_CITY : BooleanPref(true, "Show city", "Show city of asset in slideshow")
132134
data object METADATA_CUSTOMIZER : ActionPref("Customize metadata", "Configure what to show in viewer/screensaver", { context, navController ->
133-
// todo
134-
Toast.makeText(context, "Work in progress!", Toast.LENGTH_SHORT).show()
135-
// navController.navigate(
136-
// HomeFragmentDirections.actionGlobalToSettingsDialog("metadata_customizer")
137-
// )
135+
navController.navigate(
136+
MetaDataCustomizerFragmentDirections.actionToMetadataFragment()
137+
)
138138
true
139139
})
140140

app/src/main/res/drawable/down.png

2.58 KB
Loading

app/src/main/res/drawable/plus.png

1.67 KB
Loading
10.6 KB
Loading

app/src/main/res/drawable/save.png

6.65 KB
Loading

app/src/main/res/drawable/up.png

4.33 KB
Loading
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
~ Copyright 2020 Google LLC
3+
~
4+
~ Licensed under the Apache License, Version 2.0 (the "License");
5+
~ you may not use this file except in compliance with the License.
6+
~ You may obtain a copy of the License at
7+
~
8+
~ http://www.apache.org/licenses/LICENSE-2.0
9+
~
10+
~ Unless required by applicable law or agreed to in writing, software
11+
~ distributed under the License is distributed on an "AS IS" BASIS,
12+
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
~ See the License for the specific language governing permissions and
14+
~ limitations under the License.
15+
-->
16+
17+
18+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
19+
xmlns:app="http://schemas.android.com/apk/res-auto"
20+
xmlns:tools="http://schemas.android.com/tools"
21+
android:layout_width="match_parent"
22+
android:layout_height="match_parent"
23+
android:orientation="vertical"
24+
tools:context="nl.giejay.mediaslider.view.MediaSliderFragment">
25+
26+
<LinearLayout
27+
android:id="@+id/meta_data_holder"
28+
android:layout_width="wrap_content"
29+
android:layout_height="250dp"
30+
android:baselineAligned="false"
31+
android:layout_marginBottom="70dp"
32+
android:elevation="10dp"
33+
android:paddingStart="40dp"
34+
android:paddingEnd="40dp"
35+
android:gravity="bottom"
36+
app:layout_constraintBottom_toBottomOf="parent"
37+
app:layout_constraintEnd_toEndOf="parent"
38+
app:layout_constraintStart_toStartOf="parent">
39+
40+
<ListView
41+
android:id="@+id/metadata_customizer_view_left"
42+
android:layout_width="0dp"
43+
android:layout_height="wrap_content"
44+
android:layout_weight="1"></ListView>
45+
46+
<ListView
47+
android:id="@+id/metadata_customizer_view_right"
48+
android:layout_width="0dp"
49+
android:layout_height="wrap_content"
50+
android:layout_weight="1"></ListView>
51+
52+
</LinearLayout>
53+
54+
<LinearLayout
55+
android:id="@+id/meta_data_holder_add_buttons"
56+
android:layout_width="match_parent"
57+
android:layout_height="50dp"
58+
android:baselineAligned="false"
59+
android:elevation="10dp"
60+
android:gravity="bottom"
61+
android:orientation="horizontal"
62+
android:paddingBottom="10dp"
63+
app:layout_constraintBottom_toBottomOf="parent"
64+
app:layout_constraintEnd_toEndOf="parent"
65+
app:layout_constraintStart_toStartOf="parent">
66+
67+
<LinearLayout
68+
android:layout_width="match_parent"
69+
android:layout_weight="1"
70+
android:paddingStart="40dp"
71+
android:layout_height="match_parent">
72+
<ImageButton
73+
android:layout_width="40dp"
74+
android:id="@+id/meta_data_add_left"
75+
android:src="@drawable/plus"
76+
android:scaleType="centerCrop"
77+
android:layout_height="40dp">
78+
</ImageButton>
79+
</LinearLayout>
80+
81+
<LinearLayout
82+
android:layout_width="match_parent"
83+
android:layout_weight="1"
84+
android:gravity="center"
85+
android:layout_gravity="center"
86+
android:layout_height="match_parent">
87+
<ImageButton
88+
android:layout_width="40dp"
89+
android:id="@+id/meta_data_save"
90+
android:src="@drawable/save"
91+
android:scaleType="centerCrop"
92+
android:layout_height="40dp">
93+
</ImageButton>
94+
</LinearLayout>
95+
96+
<LinearLayout
97+
android:layout_width="match_parent"
98+
android:layout_weight="1"
99+
android:gravity="end"
100+
android:paddingEnd="40dp"
101+
android:layout_gravity="end"
102+
android:layout_height="match_parent">
103+
<ImageButton
104+
android:layout_width="40dp"
105+
android:id="@+id/meta_data_add_right"
106+
android:src="@drawable/plus"
107+
android:scaleType="fitCenter"
108+
android:layout_height="40dp">
109+
</ImageButton>
110+
</LinearLayout>
111+
112+
</LinearLayout>
113+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)