That fuck shit the fascists are using
1package org.tm.archive.components;
2
3
4import android.content.ContentUris;
5import android.content.Context;
6import android.database.Cursor;
7import android.net.Uri;
8import android.os.Bundle;
9import android.provider.MediaStore;
10import android.util.AttributeSet;
11import android.view.LayoutInflater;
12import android.view.View;
13import android.view.ViewGroup;
14import android.widget.FrameLayout;
15import android.widget.ImageView;
16
17import androidx.annotation.NonNull;
18import androidx.annotation.Nullable;
19import androidx.loader.app.LoaderManager;
20import androidx.loader.content.Loader;
21import androidx.recyclerview.widget.DefaultItemAnimator;
22import androidx.recyclerview.widget.LinearLayoutManager;
23import androidx.recyclerview.widget.RecyclerView;
24
25import com.bumptech.glide.Glide;
26import com.bumptech.glide.load.Key;
27import com.bumptech.glide.load.engine.DiskCacheStrategy;
28import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
29import com.bumptech.glide.signature.MediaStoreSignature;
30
31import org.signal.core.util.logging.Log;
32import org.tm.archive.R;
33import org.tm.archive.database.CursorRecyclerViewAdapter;
34import org.tm.archive.database.loaders.RecentPhotosLoader;
35
36public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.LoaderCallbacks<Cursor> {
37
38 @NonNull private final RecyclerView recyclerView;
39 @Nullable private OnItemClickedListener listener;
40
41 public RecentPhotoViewRail(Context context) {
42 this(context, null);
43 }
44
45 public RecentPhotoViewRail(Context context, AttributeSet attrs) {
46 this(context, attrs, 0);
47 }
48
49 public RecentPhotoViewRail(Context context, AttributeSet attrs, int defStyleAttr) {
50 super(context, attrs, defStyleAttr);
51
52 inflate(context, R.layout.recent_photo_view, this);
53
54 this.recyclerView = findViewById(R.id.photo_list);
55 this.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
56 this.recyclerView.setItemAnimator(new DefaultItemAnimator());
57 }
58
59 public void setListener(@Nullable OnItemClickedListener listener) {
60 this.listener = listener;
61
62 if (this.recyclerView.getAdapter() != null) {
63 ((RecentPhotoAdapter)this.recyclerView.getAdapter()).setListener(listener);
64 }
65 }
66
67 @Override
68 public @NonNull Loader<Cursor> onCreateLoader(int id, Bundle args) {
69 return new RecentPhotosLoader(getContext());
70 }
71
72 @Override
73 public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
74 this.recyclerView.setAdapter(new RecentPhotoAdapter(getContext(), data, RecentPhotosLoader.BASE_URL, listener));
75 }
76
77 @Override
78 public void onLoaderReset(@NonNull Loader<Cursor> loader) {
79 ((CursorRecyclerViewAdapter)this.recyclerView.getAdapter()).changeCursor(null);
80 }
81
82 private static class RecentPhotoAdapter extends CursorRecyclerViewAdapter<RecentPhotoAdapter.RecentPhotoViewHolder> {
83
84 @SuppressWarnings("unused")
85 private static final String TAG = Log.tag(RecentPhotoAdapter.class);
86
87 @NonNull private final Uri baseUri;
88 @Nullable private OnItemClickedListener clickedListener;
89
90 private RecentPhotoAdapter(@NonNull Context context, @NonNull Cursor cursor, @NonNull Uri baseUri, @Nullable OnItemClickedListener listener) {
91 super(context, cursor);
92 this.baseUri = baseUri;
93 this.clickedListener = listener;
94 }
95
96 @Override
97 public RecentPhotoViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {
98 View itemView = LayoutInflater.from(parent.getContext())
99 .inflate(R.layout.recent_photo_view_item, parent, false);
100
101 return new RecentPhotoViewHolder(itemView);
102 }
103
104 @Override
105 public void onBindItemViewHolder(RecentPhotoViewHolder viewHolder, @NonNull Cursor cursor) {
106 viewHolder.imageView.setImageDrawable(null);
107
108 long rowId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID));
109 long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_TAKEN));
110 long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATE_MODIFIED));
111 String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.MIME_TYPE));
112 String bucketId = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.BUCKET_ID));
113 int orientation = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION));
114 long size = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.SIZE));
115 int width = cursor.getInt(cursor.getColumnIndexOrThrow(getWidthColumn(orientation)));
116 int height = cursor.getInt(cursor.getColumnIndexOrThrow(getHeightColumn(orientation)));
117
118 final Uri uri = ContentUris.withAppendedId(RecentPhotosLoader.BASE_URL, rowId);
119
120 Key signature = new MediaStoreSignature(mimeType, dateModified, orientation);
121
122 Glide.with(getContext().getApplicationContext())
123 .load(uri)
124 .signature(signature)
125 .diskCacheStrategy(DiskCacheStrategy.NONE)
126 .transition(DrawableTransitionOptions.withCrossFade())
127 .centerCrop()
128 .into(viewHolder.imageView);
129
130 viewHolder.imageView.setOnClickListener(v -> {
131 if (clickedListener != null) clickedListener.onItemClicked(uri, mimeType, bucketId, dateTaken, width, height, size);
132 });
133
134 }
135
136 @SuppressWarnings("SuspiciousNameCombination")
137 private String getWidthColumn(int orientation) {
138 if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.WIDTH;
139 else return MediaStore.Images.ImageColumns.HEIGHT;
140 }
141
142 @SuppressWarnings("SuspiciousNameCombination")
143 private String getHeightColumn(int orientation) {
144 if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.HEIGHT;
145 else return MediaStore.Images.ImageColumns.WIDTH;
146 }
147
148 public void setListener(@Nullable OnItemClickedListener listener) {
149 this.clickedListener = listener;
150 }
151
152 static class RecentPhotoViewHolder extends RecyclerView.ViewHolder {
153
154 ImageView imageView;
155
156 RecentPhotoViewHolder(View itemView) {
157 super(itemView);
158
159 this.imageView = itemView.findViewById(R.id.thumbnail);
160 }
161 }
162 }
163
164 public interface OnItemClickedListener {
165 void onItemClicked(Uri uri, String mimeType, String bucketId, long dateTaken, int width, int height, long size);
166 }
167}