That fuck shit the fascists are using
at master 167 lines 6.7 kB view raw
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}