diff --git a/app/CoolWallpaper.jks b/app/CoolWallpaper.jks new file mode 100644 index 0000000..f26c38a Binary files /dev/null and b/app/CoolWallpaper.jks differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fb0860a..c3d332b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,13 +23,13 @@ android:name=".activity.DetailActivity" android:exported="false" /> diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/activity/DetailActivity.java b/app/src/main/java/com/wallpaper/coolwallpaper/activity/DetailActivity.java index 78db399..2ab8673 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/activity/DetailActivity.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/activity/DetailActivity.java @@ -6,6 +6,7 @@ import android.app.WallpaperManager; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -27,6 +28,7 @@ import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.wallpaper.coolwallpaper.R; +import com.wallpaper.coolwallpaper.callback.DownloadCallback; import com.wallpaper.coolwallpaper.database.CoolEntity; import com.wallpaper.coolwallpaper.databinding.ActivityDetailBinding; import com.wallpaper.coolwallpaper.util.SetAndDownloadUtils; @@ -36,7 +38,7 @@ import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class DetailActivity extends AppCompatActivity { +public class DetailActivity extends AppCompatActivity implements DownloadCallback { private ActivityDetailBinding binding; private String original; private String source; @@ -71,15 +73,17 @@ public class DetailActivity extends AppCompatActivity { source = coolEntity.getSource(); name = coolEntity.getName(); } else { + Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); finish(); } + setAndDownloadUtils = new SetAndDownloadUtils(); + roomUtils = new RoomUtils(this); handler = new Handler(Looper.getMainLooper()); executorService = Executors.newSingleThreadExecutor(); - setAndDownloadUtils = new SetAndDownloadUtils( binding.progressBar, binding.view); } private void initEvent() { @@ -93,11 +97,11 @@ public class DetailActivity extends AppCompatActivity { executorService.submit(() -> roomUtils.update(coolEntity)); }); - binding.set.setOnClickListener(v -> showCustomBottomSheetDialog()); + binding.set.setOnClickListener(v -> showCustomBottomSheet()); - binding.downPicture.setOnClickListener(v -> { + binding.down.setOnClickListener(v -> { showProgress(); - setAndDownloadUtils.setAsWallpaper(DetailActivity.this, source); + setAndDownloadUtils.setAsWallpaper(this, source,this); }); loadImage(); @@ -109,67 +113,77 @@ public class DetailActivity extends AppCompatActivity { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - setAndDownloadUtils.setAsWallpaper(this, source); + setAndDownloadUtils.setAsWallpaper(this, source,this); } else { - Toast.makeText(this, "Write permission to external storage is denied", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show(); } } } - private void showCustomBottomSheetDialog() { + private void showCustomBottomSheet() { BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this); - View dialogView = LayoutInflater.from(this).inflate(R.layout.detail_dialog, null); + View bottomSheetView = LayoutInflater.from(this).inflate(R.layout.detail_dialog, null); - dialogView.findViewById(R.id.both).setOnClickListener(v -> { - handleWallpaperAction(bitmap, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK); + bottomSheetView.findViewById(R.id.both).setOnClickListener(v -> { + disableButtons(bottomSheetView); + applyWallpaper(bitmap, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK, bottomSheetDialog); bottomSheetDialog.dismiss(); }); - dialogView.findViewById(R.id.lock).setOnClickListener(v -> { - handleWallpaperAction(bitmap, WallpaperManager.FLAG_LOCK); + bottomSheetView.findViewById(R.id.lock).setOnClickListener(v -> { + disableButtons(bottomSheetView); + applyWallpaper(bitmap, WallpaperManager.FLAG_LOCK, bottomSheetDialog); bottomSheetDialog.dismiss(); }); - dialogView.findViewById(R.id.desktop).setOnClickListener(v -> { - handleWallpaperAction(bitmap, WallpaperManager.FLAG_SYSTEM); + bottomSheetView.findViewById(R.id.desktop).setOnClickListener(v -> { + disableButtons(bottomSheetView); + applyWallpaper(bitmap, WallpaperManager.FLAG_SYSTEM, bottomSheetDialog); bottomSheetDialog.dismiss(); }); - bottomSheetDialog.setContentView(dialogView); + bottomSheetDialog.setContentView(bottomSheetView); bottomSheetDialog.show(); } - private void handleWallpaperAction(Bitmap bitmap, int flag) { + private void disableButtons(View bottomSheetView) { + bottomSheetView.findViewById(R.id.both).setEnabled(false); + bottomSheetView.findViewById(R.id.lock).setEnabled(false); + bottomSheetView.findViewById(R.id.desktop).setEnabled(false); + } + + private void applyWallpaper(Bitmap bitmap, int flag, BottomSheetDialog bottomSheetDialog) { showProgress(); + executorService.submit(() -> { - boolean isSuccess = false; + boolean success = false; try { - isSuccess = setWallpaper(bitmap, flag); + success = setWallpaperImage(bitmap, flag); } catch (Exception e) { e.printStackTrace(); } finally { - boolean finalIsSuccess = isSuccess; + boolean finalSuccess = success; handler.post(() -> { hideProgress(); - binding.set.setEnabled(true); - if (finalIsSuccess) { - Toast.makeText(getApplicationContext(), "Wallpaper setting is successful", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(getApplicationContext(), "Wallpaper setting failed", Toast.LENGTH_SHORT).show(); - } + bottomSheetDialog.findViewById(R.id.both).setEnabled(true); + bottomSheetDialog.findViewById(R.id.lock).setEnabled(true); + bottomSheetDialog.findViewById(R.id.desktop).setEnabled(true); + + String message = finalSuccess ? "Wallpaper set successfully" : "Failed to set wallpaper"; + Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); }); } }); } - private boolean setWallpaper(Bitmap bitmap, int flag) { - WallpaperManager wm = WallpaperManager.getInstance(getApplicationContext()); + private boolean setWallpaperImage(Bitmap bitmap, int flag) { + WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext()); try { binding.imageView.setDrawingCacheEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - wm.setBitmap(bitmap, null, true, flag); + wallpaperManager.setBitmap(bitmap, null, true, flag); } else { - wm.setBitmap(bitmap); + wallpaperManager.setBitmap(bitmap); } return true; } catch (IOException e) { @@ -180,6 +194,7 @@ public class DetailActivity extends AppCompatActivity { } } + private void loadImage() { Glide.with(this) .asBitmap() @@ -223,8 +238,10 @@ public class DetailActivity extends AppCompatActivity { } private void hideProgress() { - binding.progressBar.setVisibility(View.GONE); - binding.view.setVisibility(View.GONE); + if (binding != null) { + binding.progressBar.setVisibility(View.GONE); + binding.view.setVisibility(View.GONE); + } } private void showProgress() { @@ -232,6 +249,21 @@ public class DetailActivity extends AppCompatActivity { binding.view.setVisibility(View.VISIBLE); } + @Override + public void onDownloadStart() { + showProgress(); + } + + @Override + public void onDownloadComplete(Uri uri) { + hideProgress(); + } + + @Override + public void onDownloadFailed() { + hideProgress(); + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/activity/MainActivity.java b/app/src/main/java/com/wallpaper/coolwallpaper/activity/MainActivity.java index 70652c0..fa83f0d 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/activity/MainActivity.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/activity/MainActivity.java @@ -82,7 +82,7 @@ public class MainActivity extends AppCompatActivity { private void setTab(TabLayoutBinding tabLayoutBinding, int position) { int iconResId = getIconResource(position, false); - int textColorResId = R.color.gray; + int textColorResId = R.color.black; switch (position) { case 0: diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/activity/WelcomeActivity.java b/app/src/main/java/com/wallpaper/coolwallpaper/activity/WelcomeActivity.java index 064760f..bb56bdf 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/activity/WelcomeActivity.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/activity/WelcomeActivity.java @@ -17,9 +17,8 @@ import com.wallpaper.coolwallpaper.R; import com.wallpaper.coolwallpaper.databinding.ActivityWelcomeBinding; public class WelcomeActivity extends AppCompatActivity { - private ActivityWelcomeBinding binding; - private static final long TOTAL_TIME = 1000; + private static final long TOTAL_TIME = 3000; private CountDownTimer countDownTimer; @Override diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/adapter/SubListAdapter.java b/app/src/main/java/com/wallpaper/coolwallpaper/adapter/SubListAdapter.java index c755ac3..08b6b81 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/adapter/SubListAdapter.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/adapter/SubListAdapter.java @@ -46,7 +46,7 @@ public class SubListAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(activity, SubListActivity.class); + private void setItemClickListener(final CoolEntity coolEntity) { + itemImage.setOnClickListener(v -> { + Intent intent = new Intent(v.getContext(), SubListActivity.class); intent.putExtra("name", coolEntity.getName()); - activity.startActivity(intent); + v.getContext().startActivity(intent); }); } - } + } \ No newline at end of file diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/adapter/WallpaperAdapter.java b/app/src/main/java/com/wallpaper/coolwallpaper/adapter/WallpaperAdapter.java index 90819aa..3c8895d 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/adapter/WallpaperAdapter.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/adapter/WallpaperAdapter.java @@ -15,7 +15,6 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.wallpaper.coolwallpaper.R; import com.wallpaper.coolwallpaper.activity.DetailActivity; -import com.wallpaper.coolwallpaper.activity.SubListActivity; import com.wallpaper.coolwallpaper.database.AppDatabase; import com.wallpaper.coolwallpaper.database.CoolEntity; @@ -50,7 +49,7 @@ public class WallpaperAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(activity, DetailActivity.class); + private void setupItemClickListeners(CoolEntity coolEntity) { + itemImageView.setOnClickListener(v -> { + Intent intent = new Intent(v.getContext(), DetailActivity.class); intent.putExtra("cool", coolEntity); - activity.startActivity(intent); + v.getContext().startActivity(intent); }); - favoriteButton.setOnClickListener(v -> toggleFavorite(coolEntity)); + likeButton.setOnClickListener(v -> handleFavoriteToggle(coolEntity)); } - private void toggleFavorite(CoolEntity coolEntity) { - boolean newStatus = !coolEntity.getLike(); - coolEntity.setLike(newStatus); + private void handleFavoriteToggle(CoolEntity coolEntity) { + boolean updatedStatus = !coolEntity.getLike(); + coolEntity.setLike(updatedStatus); - updateImageInDatabase(coolEntity); + saveImageDataToDatabase(coolEntity); notifyItemChanged(getAdapterPosition()); } - private void updateImageInDatabase(CoolEntity coolEntity) { + private void saveImageDataToDatabase(CoolEntity coolEntity) { executor.execute(() -> { - AppDatabase.getInstance(context) + AppDatabase.getInstance(itemImageView.getContext()) .imageEntryDao() .update(coolEntity); }); } } + } \ No newline at end of file diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/callback/DownloadCallback.java b/app/src/main/java/com/wallpaper/coolwallpaper/callback/DownloadCallback.java new file mode 100644 index 0000000..3dc0648 --- /dev/null +++ b/app/src/main/java/com/wallpaper/coolwallpaper/callback/DownloadCallback.java @@ -0,0 +1,9 @@ +package com.wallpaper.coolwallpaper.callback; + +import android.net.Uri; + +public interface DownloadCallback { + void onDownloadStart(); + void onDownloadComplete(Uri uri); + void onDownloadFailed(); +} diff --git a/app/src/main/java/com/wallpaper/coolwallpaper/util/SetAndDownloadUtils.java b/app/src/main/java/com/wallpaper/coolwallpaper/util/SetAndDownloadUtils.java index 76b852d..88b7bb7 100644 --- a/app/src/main/java/com/wallpaper/coolwallpaper/util/SetAndDownloadUtils.java +++ b/app/src/main/java/com/wallpaper/coolwallpaper/util/SetAndDownloadUtils.java @@ -14,9 +14,12 @@ import android.widget.Toast; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import com.wallpaper.coolwallpaper.callback.DownloadCallback; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -26,18 +29,11 @@ import okhttp3.Response; public class SetAndDownloadUtils { public static final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 111; - private final ProgressBar progressBar; - private final ImageView overlayView; private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - public SetAndDownloadUtils(ProgressBar progressBar, ImageView overlayView) { - this.progressBar = progressBar; - this.overlayView = overlayView; - } - - public void setAsWallpaper(Activity activity, String imageUrl) { + public void setAsWallpaper(Activity activity, String imageUrl,DownloadCallback callback) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - startDownload(activity, imageUrl); + startDownload(activity, imageUrl,callback); } else { if (ContextCompat.checkSelfPermission(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { @@ -45,32 +41,29 @@ public class SetAndDownloadUtils { new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); } else { - startDownload(activity, imageUrl); + startDownload(activity, imageUrl,callback); } } } - private void startDownload(Activity activity, String imageUrl) { - progressBar.setVisibility(View.VISIBLE); - overlayView.setVisibility(View.VISIBLE); + private void startDownload(Activity activity, String imageUrl, DownloadCallback callback) { + callback.onDownloadStart(); executorService.submit(() -> { Uri uri = downloadImage(activity, imageUrl); - activity.runOnUiThread(() -> { - progressBar.setVisibility(View.GONE); - overlayView.setVisibility(View.GONE); + activity.runOnUiThread(() -> { if (uri != null) { - Toast.makeText(activity, "Wallpaper downloaded", Toast.LENGTH_SHORT).show(); + callback.onDownloadComplete(uri); } else { - Toast.makeText(activity, "Wallpaper download failure", Toast.LENGTH_SHORT).show(); + callback.onDownloadFailed(); } }); }); } private Uri downloadImage(Activity activity, String imageUrl) { - String displayName = System.currentTimeMillis() + ".jpg"; + String displayName = UUID.randomUUID().toString() + ".jpg"; ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, displayName); contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml index cb571eb..f2361d3 100644 --- a/app/src/main/res/drawable/back.xml +++ b/app/src/main/res/drawable/back.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/white"/> diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 5ce94cb..aba15d6 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -18,15 +18,15 @@ android:layout_width="30dp" android:layout_height="30dp" android:layout_marginStart="32dp" - android:layout_marginTop="32dp" + android:layout_marginTop="64dp" android:src="@drawable/back" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml index 69c6d12..06d1659 100644 --- a/app/src/main/res/layout/activity_welcome.xml +++ b/app/src/main/res/layout/activity_welcome.xml @@ -5,6 +5,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/blue_black" tools:context=".activity.WelcomeActivity"> diff --git a/app/src/main/res/layout/detail_dialog.xml b/app/src/main/res/layout/detail_dialog.xml index 1df02bf..ffe4503 100644 --- a/app/src/main/res/layout/detail_dialog.xml +++ b/app/src/main/res/layout/detail_dialog.xml @@ -1,9 +1,9 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..69d30f6 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..d3c2339 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d6..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..95396d3 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a307..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..09d28bf Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b19dc6d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d642..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/placeholder.png b/app/src/main/res/mipmap-xxxhdpi/placeholder.png index 8a76492..8617ac3 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/placeholder.png and b/app/src/main/res/mipmap-xxxhdpi/placeholder.png differ diff --git a/keystore.properties b/keystore.properties new file mode 100644 index 0000000..9026b81 --- /dev/null +++ b/keystore.properties @@ -0,0 +1,6 @@ +app_name=Cool Wallpaper +package_name=com.wallpaper.coolwallpaper +keystoreFile=app/CoolWallpaper.jks +key_alias=CoolWallpaperkey0 +key_store_password=CoolWallpaper +key_password=CoolWallpaper \ No newline at end of file