Skip to content

Commit 1180cea

Browse files
committed
Move "Camera" and "Gallery" actions out of the "Select image" submenu
Probably, most users come to the "Add" screen of Image Occlusion note type screen just in order to use the "Camera" or the "Gallery" feature; moving these actions from the submenu to the top screen of the note editor is practical. Not only from the pragmatic point of view, but also from a theoretical standpoint, "Gallery" is equivalent to "Select image" in the desktop version, so "Camera" should be a separate option on the same level with "Gallery" and "Paste image from clipboard". In fact, in AnkiMobile, the three options are placed in the same hierarchy. (Besides, there is more than enough space on the current "Add" screen for Image Occlusion note type (the screen doesn't show deck selector, tag field, toolbar, and keyboard); adding more parts will rather improve the visual balance.)
1 parent 4c812de commit 1180cea

File tree

5 files changed

+70
-175
lines changed

5 files changed

+70
-175
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ import com.ichi2.anki.OnContextAndLongClickListener.Companion.setOnContextAndLon
9191
import com.ichi2.anki.android.input.ShortcutGroup
9292
import com.ichi2.anki.android.input.ShortcutGroupProvider
9393
import com.ichi2.anki.android.input.shortcut
94-
import com.ichi2.anki.bottomsheet.ImageOcclusionBottomSheetFragment
9594
import com.ichi2.anki.common.annotations.NeedsTest
9695
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
9796
import com.ichi2.anki.dialogs.ConfirmationDialog
@@ -241,8 +240,11 @@ class NoteEditorFragment :
241240
internal var noteTypeSpinner: Spinner? = null
242241
private var deckSpinnerSelection: DeckSpinnerSelection? = null
243242
private var imageOcclusionButtonsContainer: LinearLayout? = null
244-
private var selectImageForOcclusionButton: Button? = null
245243
private var editOcclusionsButton: Button? = null
244+
private var imageSelectionForOcclusionContainer: LinearLayout? = null
245+
private var imageSelectionForOcclusionLabel: TextView? = null
246+
private var cameraForOcclusionButton: Button? = null
247+
private var galleryForOcclusionButton: Button? = null
246248
private var pasteOcclusionImageButton: Button? = null
247249

248250
// non-null after onCollectionLoaded
@@ -702,7 +704,10 @@ class NoteEditorFragment :
702704
}
703705
imageOcclusionButtonsContainer = requireView().findViewById(R.id.ImageOcclusionButtonsLayout)
704706
editOcclusionsButton = requireView().findViewById(R.id.EditOcclusionsButton)
705-
selectImageForOcclusionButton = requireView().findViewById(R.id.SelectImageForOcclusionButton)
707+
imageSelectionForOcclusionContainer = requireView().findViewById(R.id.ImageSelectionForOcclusionContainer)
708+
imageSelectionForOcclusionLabel = requireView().findViewById(R.id.ImageSelectionForOcclusionLabel)
709+
cameraForOcclusionButton = requireView().findViewById<Button>(R.id.CameraForOcclusionButton)
710+
galleryForOcclusionButton = requireView().findViewById<Button>(R.id.GalleryForOcclusionButton)
706711
pasteOcclusionImageButton = requireView().findViewById(R.id.PasteImageForOcclusionButton)
707712

708713
try {
@@ -761,33 +766,23 @@ class NoteEditorFragment :
761766

762767
if (addNote) {
763768
editOcclusionsButton?.visibility = View.GONE
764-
selectImageForOcclusionButton?.setOnClickListener {
765-
Timber.i("selecting image for occlusion")
766-
val imageOcclusionBottomSheet = ImageOcclusionBottomSheetFragment()
767-
imageOcclusionBottomSheet.listener =
768-
object : ImageOcclusionBottomSheetFragment.ImagePickerListener {
769-
override fun onCameraClicked() {
770-
Timber.i("onCameraClicked")
771-
dispatchCameraEvent()
772-
}
773769

774-
override fun onGalleryClicked() {
775-
Timber.i("onGalleryClicked")
776-
try {
777-
ioEditorLauncher.launch("image/*")
778-
} catch (_: ActivityNotFoundException) {
779-
Timber.w("No app found to handle onGalleryClicked request")
780-
activity?.showSnackbar(R.string.activity_start_failed)
781-
}
782-
}
783-
}
784-
imageOcclusionBottomSheet.show(
785-
parentFragmentManager,
786-
"ImageOcclusionBottomSheetFragment",
787-
)
770+
imageSelectionForOcclusionLabel?.text = TR.notetypesImage() + ":"
771+
772+
cameraForOcclusionButton?.setOnClickListener {
773+
Timber.i("Camera button clicked")
774+
dispatchCameraEvent()
788775
}
789776

790-
pasteOcclusionImageButton?.text = TR.notetypesIoPasteImageFromClipboard()
777+
galleryForOcclusionButton?.setOnClickListener {
778+
Timber.i("Gallery button clicked")
779+
try {
780+
ioEditorLauncher.launch("image/*")
781+
} catch (_: ActivityNotFoundException) {
782+
Timber.w("No app found to handle onGalleryClicked request")
783+
activity?.showSnackbar(R.string.activity_start_failed)
784+
}
785+
}
791786
pasteOcclusionImageButton?.setOnClickListener {
792787
// TODO: Support all extensions
793788
// See https://github.com/ankitects/anki/blob/6f3550464d37aee1b8b784e431cbfce8382d3ce7/rslib/src/image_occlusion/imagedata.rs#L154
@@ -806,8 +801,7 @@ class NoteEditorFragment :
806801
}
807802
}
808803
} else {
809-
selectImageForOcclusionButton?.visibility = View.GONE
810-
pasteOcclusionImageButton?.visibility = View.GONE
804+
imageSelectionForOcclusionContainer?.visibility = View.GONE
811805
editOcclusionsButton?.visibility = View.VISIBLE
812806
editOcclusionsButton?.text = resources.getString(R.string.edit_occlusions)
813807
editOcclusionsButton?.setOnClickListener {

AnkiDroid/src/main/java/com/ichi2/anki/bottomsheet/ImageOcclusionBottomSheetFragment.kt

Lines changed: 0 additions & 61 deletions
This file was deleted.

AnkiDroid/src/main/res/layout/image_occlusion_options_layout.xml

Lines changed: 0 additions & 73 deletions
This file was deleted.

AnkiDroid/src/main/res/layout/note_editor_fragment.xml

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,53 @@
9292
android:layout_height="wrap_content"
9393
android:text="@string/edit_occlusions" />
9494

95-
<com.google.android.material.button.MaterialButton
96-
android:id="@+id/SelectImageForOcclusionButton"
95+
<LinearLayout
96+
android:id="@+id/ImageSelectionForOcclusionContainer"
9797
android:layout_width="match_parent"
9898
android:layout_height="wrap_content"
99-
app:icon="@drawable/ic_add"
100-
app:iconGravity="textStart"
101-
android:text="@string/choose_an_image" />
99+
android:orientation="vertical"
100+
android:paddingTop="14dp">
102101

103-
<com.google.android.material.button.MaterialButton
104-
android:id="@+id/PasteImageForOcclusionButton"
105-
android:layout_width="match_parent"
106-
android:layout_height="wrap_content"
107-
tools:text="Paste Image from Clipboard"
108-
app:icon="@drawable/ic_paste"
109-
app:iconGravity="textStart"/>
102+
<com.ichi2.ui.FixedTextView
103+
android:id="@+id/ImageSelectionForOcclusionLabel"
104+
android:layout_width="wrap_content"
105+
android:layout_height="wrap_content"
106+
android:layout_gravity="start"
107+
android:layout_marginLeft="8dip"
108+
android:layout_marginRight="8dip"
109+
android:layout_marginBottom="4dip"
110+
android:clickable="false"
111+
android:gravity="start|center_vertical"
112+
android:textStyle="bold"
113+
tools:text="Image:"/>
114+
115+
<com.google.android.material.button.MaterialButton
116+
android:id="@+id/GalleryForOcclusionButton"
117+
android:layout_width="match_parent"
118+
android:layout_height="wrap_content"
119+
android:layout_marginHorizontal="15dp"
120+
android:text="@string/multimedia_editor_image_field_editing_galery"
121+
app:icon="@drawable/ic_gallery"
122+
app:iconGravity="textStart" />
110123

124+
<com.google.android.material.button.MaterialButton
125+
android:id="@+id/CameraForOcclusionButton"
126+
android:layout_width="match_parent"
127+
android:layout_height="wrap_content"
128+
android:layout_marginHorizontal="15dp"
129+
app:icon="@drawable/ic_camera"
130+
app:iconGravity="textStart"
131+
android:text="@string/multimedia_editor_image_field_editing_photo" />
132+
133+
<com.google.android.material.button.MaterialButton
134+
android:id="@+id/PasteImageForOcclusionButton"
135+
android:layout_width="match_parent"
136+
android:layout_height="wrap_content"
137+
android:layout_marginHorizontal="15dp"
138+
app:icon="@drawable/ic_paste"
139+
app:iconGravity="textStart"
140+
android:text="@string/paste_from_clipboard" />
141+
</LinearLayout>
111142
</LinearLayout>
112143

113144
<androidx.appcompat.widget.AppCompatButton

AnkiDroid/src/main/res/values/02-strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@
2222
<!-- Navigation drawer strings -->
2323
<string name="drawer_open">Open drawer</string>
2424
<string name="drawer_close">Close drawer</string>
25+
2526
<string name="note_message">Note saved</string>
27+
28+
<!-- Note editor screen -->
2629
<string name="CardEditorCardDeck">Card deck:</string>
2730
<string name="CardEditorNoteDeck">Deck:</string>
2831
<string name="CardEditorModel">Type:</string>
2932
<string name="CardEditorTags">Tags: %1$s</string>
3033
<string name="CardEditorCards">Cards: %1$s</string>
3134
<string name="edit_occlusions">Edit Occlusions</string>
35+
<string name="paste_from_clipboard" maxLength="28">Paste from clipboard</string>
3236

3337
<string name="tag_name">Tag name</string>
3438
<string name="add_new_filter_tags">Add/filter tags</string>

0 commit comments

Comments
 (0)