diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-11-04 19:20:21 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-11-04 19:20:21 +0300 |
commit | a78b0f8935d90870527b3e75ed27c4f35349972f (patch) | |
tree | 10ae160c54cecf15c2cd954e61bf7254f977e238 | |
parent | 660b9b28978fe5cd373dffaf6ccf682228625174 (diff) |
Small refactorings
Signed-off-by: Stefan Niedermann <info@niedermann.it>
13 files changed, 145 insertions, 90 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java index 32634ad66..1518b5913 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java @@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.ui.card.attachments.picker; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; +import android.graphics.Bitmap; import android.net.Uri; import androidx.annotation.NonNull; @@ -10,6 +11,8 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.Arrays; import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.Consumer; import static android.database.Cursor.FIELD_TYPE_BLOB; @@ -19,10 +22,15 @@ import static android.database.Cursor.FIELD_TYPE_NULL; import static android.database.Cursor.FIELD_TYPE_STRING; import static androidx.recyclerview.widget.RecyclerView.NO_ID; +/** + * An {@link RecyclerView.Adapter} which provides previews of one type of files and also an option to open a native dialog. + * <p> + * Example: Previews for images of the gallery as well a one option to take a photo + */ public abstract class AbstractPickerAdapter<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> { protected static final int VIEW_TYPE_ITEM = 0; - protected static final int VIEW_TYPE_ITEM_PICKER = 1; + protected static final int VIEW_TYPE_ITEM_NATIVE = 1; private final int count; protected final int columnIndex; @@ -36,6 +44,12 @@ public abstract class AbstractPickerAdapter<T extends RecyclerView.ViewHolder> e @NonNull protected final ContentResolver contentResolver; + /** + * Should be used to bind heavy operations like when dealing with {@link Bitmap} + */ + @NonNull + protected final ExecutorService bindExecutor = Executors.newCachedThreadPool(); + public AbstractPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, Uri subject, String idColumn, String sortOrder) { this(context, onSelect, openNativePicker, subject, idColumn, new String[]{idColumn}, sortOrder); } @@ -85,12 +99,12 @@ public abstract class AbstractPickerAdapter<T extends RecyclerView.ViewHolder> e @Override public int getItemViewType(int position) { return position == 0 - ? VIEW_TYPE_ITEM_PICKER + ? VIEW_TYPE_ITEM_NATIVE : VIEW_TYPE_ITEM; } /** - * Call this method when the {@link AbstractPickerAdapter} is no longe need to free resources. + * Call this method when the {@link AbstractPickerAdapter} is no longer need to free resources. */ public void onDestroy() { cursor.close(); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java index 9207362a3..e1cefcd59 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java @@ -16,11 +16,9 @@ import androidx.recyclerview.widget.RecyclerView; import java.io.IOException; import java.io.InputStream; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.function.Consumer; -import it.niedermann.nextcloud.deck.databinding.ItemFilterUserBinding; +import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; import static android.provider.ContactsContract.Contacts.CONTENT_LOOKUP_URI; @@ -33,8 +31,6 @@ public class ContactAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde private final int displayNameColumnIndex; - @NonNull - private final ExecutorService bitmapExecutor = Executors.newCachedThreadPool(); public ContactAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { super(context, onSelect, onSelectPicker, CONTENT_URI, LOOKUP_KEY, new String[]{LOOKUP_KEY, DISPLAY_NAME}, SORT_KEY_PRIMARY); @@ -46,8 +42,8 @@ public class ContactAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType) { - case VIEW_TYPE_ITEM_PICKER: - return new ContactPickerItemViewHolder(ItemFilterUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + case VIEW_TYPE_ITEM_NATIVE: + return new ContactNativeItemViewHolder(ItemPickerNativeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); case VIEW_TYPE_ITEM: return new ContactItemViewHolder(ItemPickerUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); default: @@ -58,12 +54,12 @@ public class ContactAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { - case VIEW_TYPE_ITEM_PICKER: { - ((ContactPickerItemViewHolder) holder).bind(openNativePicker); + case VIEW_TYPE_ITEM_NATIVE: { + ((ContactNativeItemViewHolder) holder).bind(openNativePicker); break; } case VIEW_TYPE_ITEM: { - bitmapExecutor.execute(() -> { + bindExecutor.execute(() -> { final ContactItemViewHolder viewHolder = (ContactItemViewHolder) holder; final long id = getItemId(position); final String name = cursor.getString(displayNameColumnIndex); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java new file mode 100644 index 000000000..e4d1a0a2e --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java @@ -0,0 +1,22 @@ +package it.niedermann.nextcloud.deck.ui.card.attachments.picker; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; + +public class ContactNativeItemViewHolder extends RecyclerView.ViewHolder { + + private final ItemPickerNativeBinding binding; + + public ContactNativeItemViewHolder(@NonNull ItemPickerNativeBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + public void bind(@NonNull Runnable onOpenMajorPicker) { + binding.title.setText(R.string.show_all_contacts); + itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactPickerItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactPickerItemViewHolder.java deleted file mode 100644 index 7978dde93..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactPickerItemViewHolder.java +++ /dev/null @@ -1,27 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.card.attachments.picker; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemFilterUserBinding; - -public class ContactPickerItemViewHolder extends RecyclerView.ViewHolder { - - private final ItemFilterUserBinding binding; - - public ContactPickerItemViewHolder(@NonNull ItemFilterUserBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - - public void bind(Runnable onOpenMajorPicker) { - Glide.with(itemView.getContext()) - .load(R.drawable.ic_baseline_account_circle_24) - .into(binding.avatar); - binding.displayName.setText("Show all contacts"); - itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java index addf4979b..8f8c45d1e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java @@ -12,11 +12,9 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.function.Consumer; -import it.niedermann.nextcloud.deck.databinding.ItemFilterUserBinding; +import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; import static android.provider.BaseColumns._ID; @@ -28,8 +26,6 @@ public class FileAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> private final int displayNameColumnIndex; private final int sizeColumnIndex; - @NonNull - private final ExecutorService bitmapExecutor = Executors.newCachedThreadPool(); public FileAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { super(context, onSelect, onSelectPicker, MediaStore.Files.getContentUri("external"), _ID, new String[]{_ID, TITLE, SIZE}, DATE_ADDED + " DESC"); @@ -42,8 +38,8 @@ public class FileAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType) { - case VIEW_TYPE_ITEM_PICKER: - return new FilePickerItemViewHolder(ItemFilterUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + case VIEW_TYPE_ITEM_NATIVE: + return new FileNativeItemViewHolder(ItemPickerNativeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); case VIEW_TYPE_ITEM: return new FileItemViewHolder(ItemPickerUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); default: @@ -54,12 +50,12 @@ public class FileAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { - case VIEW_TYPE_ITEM_PICKER: { - ((FilePickerItemViewHolder) holder).bind(openNativePicker); + case VIEW_TYPE_ITEM_NATIVE: { + ((FileNativeItemViewHolder) holder).bind(openNativePicker); break; } case VIEW_TYPE_ITEM: { - bitmapExecutor.execute(() -> { + bindExecutor.execute(() -> { final long id = getItemId(position); final String name = cursor.getString(displayNameColumnIndex); final long size = cursor.getLong(sizeColumnIndex); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java new file mode 100644 index 000000000..e7adc968a --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java @@ -0,0 +1,22 @@ +package it.niedermann.nextcloud.deck.ui.card.attachments.picker; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; + +public class FileNativeItemViewHolder extends RecyclerView.ViewHolder { + + private final ItemPickerNativeBinding binding; + + public FileNativeItemViewHolder(@NonNull ItemPickerNativeBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + public void bind(Runnable onOpenMajorPicker) { + binding.title.setText(R.string.show_all_files); + itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FilePickerItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FilePickerItemViewHolder.java deleted file mode 100644 index 2cf012acb..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FilePickerItemViewHolder.java +++ /dev/null @@ -1,27 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.card.attachments.picker; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemFilterUserBinding; - -public class FilePickerItemViewHolder extends RecyclerView.ViewHolder { - - private final ItemFilterUserBinding binding; - - public FilePickerItemViewHolder(@NonNull ItemFilterUserBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - - public void bind(Runnable onOpenMajorPicker) { - Glide.with(itemView.getContext()) - .load(R.drawable.ic_attach_file_grey600_24dp) - .into(binding.avatar); - binding.displayName.setText("Show all files"); - itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java index b7f76f3d3..fddd87f51 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java @@ -17,8 +17,6 @@ import androidx.lifecycle.LifecycleOwner; import androidx.recyclerview.widget.RecyclerView; import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.function.Consumer; import it.niedermann.nextcloud.deck.databinding.ItemAttachmentImageBinding; @@ -32,8 +30,6 @@ import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> { @NonNull - private final ExecutorService bitmapExecutor = Executors.newCachedThreadPool(); - @NonNull private final LifecycleOwner lifecycleOwner; @SuppressLint("InlinedApi") @@ -51,8 +47,8 @@ public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType) { - case VIEW_TYPE_ITEM_PICKER: - return new GalleryPickerItemViewHolder(ItemPhotoPreviewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + case VIEW_TYPE_ITEM_NATIVE: + return new GalleryPhotoPreviewItemViewHolder(ItemPhotoPreviewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); case VIEW_TYPE_ITEM: return new GalleryItemViewHolder(ItemAttachmentImageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); default: @@ -64,12 +60,12 @@ public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { - case VIEW_TYPE_ITEM_PICKER: { - ((GalleryPickerItemViewHolder) holder).bind(openNativePicker, lifecycleOwner); + case VIEW_TYPE_ITEM_NATIVE: { + ((GalleryPhotoPreviewItemViewHolder) holder).bind(openNativePicker, lifecycleOwner); break; } case VIEW_TYPE_ITEM: { - bitmapExecutor.execute(() -> { + bindExecutor.execute(() -> { final long id = getItemId(position); try { final Bitmap thumbnail; @@ -94,8 +90,8 @@ public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde @Override public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) { super.onViewDetachedFromWindow(holder); - if(holder instanceof GalleryPickerItemViewHolder) { - ((GalleryPickerItemViewHolder) holder).unbind(); + if(holder instanceof GalleryPhotoPreviewItemViewHolder) { + ((GalleryPhotoPreviewItemViewHolder) holder).unbind(); } } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryPickerItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryPhotoPreviewItemViewHolder.java index 6aecfb373..e77503d02 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryPickerItemViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryPhotoPreviewItemViewHolder.java @@ -16,12 +16,12 @@ import it.niedermann.nextcloud.deck.databinding.ItemPhotoPreviewBinding; import static androidx.camera.core.CameraSelector.DEFAULT_BACK_CAMERA; -public class GalleryPickerItemViewHolder extends RecyclerView.ViewHolder { +public class GalleryPhotoPreviewItemViewHolder extends RecyclerView.ViewHolder { private final ItemPhotoPreviewBinding binding; private ProcessCameraProvider cameraProvider; - public GalleryPickerItemViewHolder(@NonNull ItemPhotoPreviewBinding binding) { + public GalleryPhotoPreviewItemViewHolder(@NonNull ItemPhotoPreviewBinding binding) { super(binding.getRoot()); this.binding = binding; } diff --git a/app/src/main/res/drawable/ic_baseline_search_24.xml b/app/src/main/res/drawable/ic_baseline_search_24.xml new file mode 100644 index 000000000..2eb5033c1 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_search_24.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#757575" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> +</vector> diff --git a/app/src/main/res/layout/fragment_card_edit_tab_attachments.xml b/app/src/main/res/layout/fragment_card_edit_tab_attachments.xml index 91e82317b..63d1657f2 100644 --- a/app/src/main/res/layout/fragment_card_edit_tab_attachments.xml +++ b/app/src/main/res/layout/fragment_card_edit_tab_attachments.xml @@ -31,6 +31,7 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" + android:contentDescription="@string/upload_a_new_attachment" android:visibility="gone" app:backgroundTint="@color/defaultBrand" app:srcCompat="@drawable/ic_file_upload_white_24dp" @@ -69,6 +70,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimarySurface" + android:padding="@dimen/spacer_1x" tools:listitem="@layout/support_simple_spinner_dropdown_item" tools:visibility="gone" /> </LinearLayout> diff --git a/app/src/main/res/layout/item_picker_native.xml b/app/src/main/res/layout/item_picker_native.xml new file mode 100644 index 000000000..75d42469e --- /dev/null +++ b/app/src/main/res/layout/item_picker_native.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/selectableItemBackground" + android:orientation="horizontal" + android:paddingStart="@dimen/spacer_1x" + android:paddingTop="@dimen/spacer_2x" + android:paddingEnd="@dimen/spacer_1x" + android:paddingBottom="@dimen/spacer_2x"> + + <ImageView + android:id="@+id/avatar" + android:layout_width="@dimen/avatar_size" + android:layout_height="@dimen/avatar_size" + android:layout_marginEnd="10dp" + android:contentDescription="@null" + app:srcCompat="@drawable/ic_baseline_search_24" /> + + <TextView + android:id="@+id/title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:textAppearance="?attr/textAppearanceListItem" + tools:text="Search all files" /> + </LinearLayout> + + + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="@color/bg_info_box" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacer_2x" + android:paddingStart="56dp" + android:paddingTop="@dimen/spacer_1x" + android:paddingEnd="@dimen/spacer_1x" + android:paddingBottom="@dimen/spacer_1x" + android:text="@string/recent" + android:textAppearance="?attr/textAppearanceOverline" /> +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b7b50682b..687ae66ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -318,4 +318,8 @@ <string name="take_photo">Take a photo</string> <string name="take_photo_switch_camera">Switch camera</string> <string name="take_photo_toggle_torch">Toggle torch</string> + <string name="show_all_contacts">Show all contacts</string> + <string name="show_all_files">Show all files</string> + <string name="recent">Recent</string> + <string name="upload_a_new_attachment">Upload a new attachment</string> </resources> |