实现主窗口背景颜色修改功能。

This commit is contained in:
2026-05-02 10:40:22 +08:00
parent 03ae37dc91
commit a2884122aa

View File

@@ -26,11 +26,12 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import cc.winboll.studio.gallery.AlbumAdapter.OnAlbumClickListener; import cc.winboll.studio.gallery.AlbumAdapter.OnAlbumClickListener;
import cc.winboll.studio.gallery.utils.BackgroundUtils; import cc.winboll.studio.gallery.utils.BackgroundUtils;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogActivity; import cc.winboll.studio.libappbase.LogActivity;
import cc.winboll.studio.libappbase.LogUtils;
import com.a4455jkjh.colorpicker.ColorPickerDialog;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.FilenameFilter; import java.io.FilenameFilter;
@@ -50,64 +51,60 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
LogUtils.d(TAG, "onCreate"); LogUtils.d(TAG, "onCreate");
View content = findViewById(android.R.id.content);
if (content != null) {
content.setBackground(BackgroundUtils.getInstance().getDrawable());
}
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
prefs = new Preferences(this); prefs = new Preferences(this);
recyclerView = findViewById(R.id.recycler_view); recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
adapter = new AlbumAdapter(); adapter = new AlbumAdapter();
adapter.setContext(this); adapter.setContext(this);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
fabScrollTop = findViewById(R.id.fab_scroll_top); fabScrollTop = findViewById(R.id.fab_scroll_top);
fabScrollTop.setOnClickListener(new View.OnClickListener() { fabScrollTop.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
recyclerView.scrollToPosition(0); recyclerView.scrollToPosition(0);
} }
}); });
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override @Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy); super.onScrolled(recyclerView, dx, dy);
GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager(); GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
if (layoutManager != null) { if (layoutManager != null) {
int firstVisible = layoutManager.findFirstVisibleItemPosition(); int firstVisible = layoutManager.findFirstVisibleItemPosition();
if (firstVisible > 0) { if (firstVisible > 0) {
fabScrollTop.setVisibility(View.VISIBLE); fabScrollTop.setVisibility(View.VISIBLE);
} else { } else {
fabScrollTop.setVisibility(View.GONE); fabScrollTop.setVisibility(View.GONE);
} }
} }
} }
}); });
adapter.setOnAlbumClickListener(new OnAlbumClickListener() { adapter.setOnAlbumClickListener(new OnAlbumClickListener() {
@Override @Override
public void onAlbumClick(Album album) { public void onAlbumClick(Album album) {
Intent intent = new Intent(MainActivity.this, AlbumActivity.class); Intent intent = new Intent(MainActivity.this, AlbumActivity.class);
intent.putExtra(AlbumActivity.EXTRA_ALBUM_PATH, album.getPath()); intent.putExtra(AlbumActivity.EXTRA_ALBUM_PATH, album.getPath());
intent.putExtra(AlbumActivity.EXTRA_ALBUM_NAME, album.getName()); intent.putExtra(AlbumActivity.EXTRA_ALBUM_NAME, album.getName());
startActivity(intent); startActivity(intent);
} }
}); });
checkAndRequestPermissions(); checkAndRequestPermissions();
} }
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
View content = findViewById(android.R.id.content);
if (content != null) {
content.setBackground(BackgroundUtils.getInstance().getDrawable());
}
}
private void checkAndRequestPermissions() { private void checkAndRequestPermissions() {
LogUtils.i(TAG, "checkAndRequestPermissions"); LogUtils.i(TAG, "checkAndRequestPermissions");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -123,14 +120,14 @@ public class MainActivity extends AppCompatActivity {
return; return;
} }
} }
if (checkPermission()) { if (checkPermission()) {
loadAlbums(); loadAlbums();
} else { } else {
requestPermission(); requestPermission();
} }
} }
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
@@ -144,7 +141,7 @@ public class MainActivity extends AppCompatActivity {
} }
} }
} }
private boolean checkPermission() { private boolean checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return Environment.isExternalStorageManager(); return Environment.isExternalStorageManager();
@@ -155,13 +152,13 @@ public class MainActivity extends AppCompatActivity {
private void requestPermission() { private void requestPermission() {
ActivityCompat.requestPermissions(this, ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE); PERMISSION_REQUEST_CODE);
} }
@Override @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) { @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) { if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
@@ -172,12 +169,12 @@ public class MainActivity extends AppCompatActivity {
} }
} }
private void loadAlbums() { private void loadAlbums() {
LogUtils.d(TAG, "loadAlbums"); LogUtils.d(TAG, "loadAlbums");
String folderPath = prefs.getFolderPath(); String folderPath = prefs.getFolderPath();
File baseFolder = new File(folderPath); File baseFolder = new File(folderPath);
LogUtils.d(TAG, "baseFolder: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists()); LogUtils.d(TAG, "baseFolder: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
if (!baseFolder.exists() || !baseFolder.isDirectory()) { if (!baseFolder.exists() || !baseFolder.isDirectory()) {
folderPath = Preferences.getDefaultPath(); folderPath = Preferences.getDefaultPath();
baseFolder = new File(folderPath); baseFolder = new File(folderPath);
@@ -188,10 +185,10 @@ private void loadAlbums() {
LogUtils.d(TAG, "try Pictures: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists()); LogUtils.d(TAG, "try Pictures: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
} }
} }
AlbumCoverDbHelper coverDbHelper = AlbumCoverDbHelper.getInstance(this); AlbumCoverDbHelper coverDbHelper = AlbumCoverDbHelper.getInstance(this);
ArrayList<Album> albums = new ArrayList<>(); ArrayList<Album> albums = new ArrayList<>();
FileFilter directoryFilter = new FileFilter() { FileFilter directoryFilter = new FileFilter() {
@Override @Override
public boolean accept(File file) { public boolean accept(File file) {
@@ -234,7 +231,7 @@ private void loadAlbums() {
} }
} }
} }
if (albums.isEmpty()) { if (albums.isEmpty()) {
Toast.makeText(this, R.string.no_images_found, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.no_images_found, Toast.LENGTH_SHORT).show();
LogUtils.i(TAG, "No albums found"); LogUtils.i(TAG, "No albums found");
@@ -242,14 +239,14 @@ private void loadAlbums() {
adapter.setData(albums); adapter.setData(albums);
LogUtils.d(TAG, "Loaded " + albums.size() + " albums"); LogUtils.d(TAG, "Loaded " + albums.size() + " albums");
} }
private Uri getUriFromPath(String path) { private Uri getUriFromPath(String path) {
String[] projection = { MediaStore.Images.Media._ID }; String[] projection = { MediaStore.Images.Media._ID };
String selection = MediaStore.Images.Media.DATA + " = ?"; String selection = MediaStore.Images.Media.DATA + " = ?";
String[] selectionArgs = { path }; String[] selectionArgs = { path };
try (Cursor cursor = getContentResolver().query( try (Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, selection, selectionArgs, null)) { projection, selection, selectionArgs, null)) {
if (cursor != null) { if (cursor != null) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
@@ -259,18 +256,18 @@ private void loadAlbums() {
} }
return null; return null;
} }
private ArrayList<Uri> getImagesInFolder(String folderPath) { private ArrayList<Uri> getImagesInFolder(String folderPath) {
ArrayList<Uri> imageUrls = new ArrayList<>(); ArrayList<Uri> imageUrls = new ArrayList<>();
ContentResolver contentResolver = getContentResolver(); ContentResolver contentResolver = getContentResolver();
Uri collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Images.Media.DATA + " LIKE ?"; String selection = MediaStore.Images.Media.DATA + " LIKE ?";
String[] selectionArgs = new String[]{folderPath + "/%"}; String[] selectionArgs = new String[]{folderPath + "/%"};
String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC"; String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
LogUtils.d(TAG, "getImagesInFolder: " + folderPath); LogUtils.d(TAG, "getImagesInFolder: " + folderPath);
try (Cursor cursor = contentResolver.query(collection, null, selection, selectionArgs, sortOrder)) { try (Cursor cursor = contentResolver.query(collection, null, selection, selectionArgs, sortOrder)) {
if (cursor != null) { if (cursor != null) {
LogUtils.d(TAG, "cursor count: " + cursor.getCount()); LogUtils.d(TAG, "cursor count: " + cursor.getCount());
@@ -306,7 +303,31 @@ private void loadAlbums() {
startActivity(intent); startActivity(intent);
return true; return true;
} else if (id == R.id.action_change_bg_color) { } else if (id == R.id.action_change_bg_color) {
Toast.makeText(this, "修改背景颜色", Toast.LENGTH_SHORT).show(); //Toast.makeText(this, "修改背景颜色", Toast.LENGTH_SHORT).show();
if (BackgroundUtils.DrawableType.COLOR == BackgroundUtils.getInstance().getDrawableType()) {
ColorPickerDialog dlg = new ColorPickerDialog(this, BackgroundUtils.getInstance().getColor());
dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() {
@Override
public void beforeColorChanged() {
}
@Override
public void onColorChanged(int color) {
BackgroundUtils.getInstance().initFromColor(MainActivity.this, color);
View content = findViewById(android.R.id.content);
if (content != null) {
content.setBackground(BackgroundUtils.getInstance().getDrawable());
}
}
@Override
public void afterColorChanged() {
}
});
dlg.show();
}
return true; return true;
} else if (id == R.id.action_settings) { } else if (id == R.id.action_settings) {
startActivity(new Intent(this, SettingsActivity.class)); startActivity(new Intent(this, SettingsActivity.class));
@@ -323,7 +344,7 @@ private void loadAlbums() {
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
private BroadcastReceiver coverUpdatedReceiver = new BroadcastReceiver() { private BroadcastReceiver coverUpdatedReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -332,7 +353,7 @@ private void loadAlbums() {
} }
} }
}; };
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@@ -347,35 +368,35 @@ private void loadAlbums() {
adapter.refreshCover(); adapter.refreshCover();
} }
} }
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
unregisterReceiver(coverUpdatedReceiver); unregisterReceiver(coverUpdatedReceiver);
} }
private void scanMediaStore() { private void scanMediaStore() {
String folderPath = prefs.getFolderPath(); String folderPath = prefs.getFolderPath();
File baseFolder = new File(folderPath); File baseFolder = new File(folderPath);
if (baseFolder.exists() && baseFolder.isDirectory()) { if (baseFolder.exists() && baseFolder.isDirectory()) {
File[] subfolders = baseFolder.listFiles(new FileFilter() { File[] subfolders = baseFolder.listFiles(new FileFilter() {
@Override @Override
public boolean accept(File file) { public boolean accept(File file) {
return file.isDirectory(); return file.isDirectory();
} }
}); });
if (subfolders != null) { if (subfolders != null) {
ArrayList<String> paths = new ArrayList<>(); ArrayList<String> paths = new ArrayList<>();
for (File subfolder : subfolders) { for (File subfolder : subfolders) {
File[] images = subfolder.listFiles(new FilenameFilter() { File[] images = subfolder.listFiles(new FilenameFilter() {
@Override @Override
public boolean accept(File dir, String name) { public boolean accept(File dir, String name) {
String lower = name.toLowerCase(); String lower = name.toLowerCase();
return lower.endsWith(".jpg") || lower.endsWith(".jpeg") return lower.endsWith(".jpg") || lower.endsWith(".jpeg")
|| lower.endsWith(".png") || lower.endsWith(".gif") || lower.endsWith(".png") || lower.endsWith(".gif")
|| lower.endsWith(".webp") || lower.endsWith(".bmp"); || lower.endsWith(".webp") || lower.endsWith(".bmp");
} }
}); });
if (images != null) { if (images != null) {
for (File img : images) { for (File img : images) {
paths.add(img.getAbsolutePath()); paths.add(img.getAbsolutePath());
@@ -386,11 +407,11 @@ private void loadAlbums() {
LogUtils.d(TAG, "scanning " + paths.size() + " files to MediaStore"); LogUtils.d(TAG, "scanning " + paths.size() + " files to MediaStore");
String[] pathArray = paths.toArray(new String[0]); String[] pathArray = paths.toArray(new String[0]);
MediaScannerConnection.scanFile(this, pathArray, null, new MediaScannerConnection.OnScanCompletedListener() { MediaScannerConnection.scanFile(this, pathArray, null, new MediaScannerConnection.OnScanCompletedListener() {
@Override @Override
public void onScanCompleted(String path, Uri uri) { public void onScanCompleted(String path, Uri uri) {
LogUtils.d(TAG, "scanCompleted: " + path + " -> " + uri); LogUtils.d(TAG, "scanCompleted: " + path + " -> " + uri);
} }
}); });
} }
} }
} }