diff --git a/app/ARDrawingFlow.jks b/app/ARDrawingFlow.jks new file mode 100644 index 0000000..ab884ad Binary files /dev/null and b/app/ARDrawingFlow.jks differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..09b7846 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,17 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keepclassmembers class com.ardraw.ardrawingflow.MyApplication { + public static final java.lang.String DATABASE_NAME; + public static final int DATABASE_VERSION; +} + +-keepclassmembers class * { + @androidx.room.Query ; +} + +-keep class com.ardraw.ardrawingflow.data.database.AppDatabase { *; } +-keep class com.ardraw.ardrawingflow.data.database.dao.FlowDataDao { *; } +-keep class com.ardraw.ardrawingflow.data.database.entity.FlowData { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c530417..03f42e7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,15 +8,13 @@ + - diff --git a/app/src/main/java/com/ardraw/ardrawingflow/callback/DeleteCallback.java b/app/src/main/java/com/ardraw/ardrawingflow/callback/DeleteCallback.java new file mode 100644 index 0000000..d6358c8 --- /dev/null +++ b/app/src/main/java/com/ardraw/ardrawingflow/callback/DeleteCallback.java @@ -0,0 +1,7 @@ +package com.ardraw.ardrawingflow.callback; + +import com.ardraw.ardrawingflow.data.database.entity.FlowData; + +public interface DeleteCallback { + void onDelete(FlowData flowData); +} diff --git a/app/src/main/java/com/ardraw/ardrawingflow/data/database/database/AppDatabase.java b/app/src/main/java/com/ardraw/ardrawingflow/data/database/AppDatabase.java similarity index 94% rename from app/src/main/java/com/ardraw/ardrawingflow/data/database/database/AppDatabase.java rename to app/src/main/java/com/ardraw/ardrawingflow/data/database/AppDatabase.java index 90b5b08..da3fa8f 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/data/database/database/AppDatabase.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/data/database/AppDatabase.java @@ -1,4 +1,4 @@ -package com.ardraw.ardrawingflow.data.database.database; +package com.ardraw.ardrawingflow.data.database; import android.content.Context; diff --git a/app/src/main/java/com/ardraw/ardrawingflow/data/database/dao/FlowDataDao.java b/app/src/main/java/com/ardraw/ardrawingflow/data/database/dao/FlowDataDao.java index 350b7ae..25cdd30 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/data/database/dao/FlowDataDao.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/data/database/dao/FlowDataDao.java @@ -2,6 +2,7 @@ package com.ardraw.ardrawingflow.data.database.dao; import androidx.lifecycle.LiveData; import androidx.room.Dao; +import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; import androidx.room.Update; @@ -13,18 +14,21 @@ import java.util.List; @Dao public interface FlowDataDao { @Insert - void insertAll(List FlowData); + void insertAll(List flowDataList); @Insert - void insert(FlowData FlowData); + void insert(FlowData flowData); @Update - void update(FlowData FlowData); + void update(FlowData flowData); - @Query("SELECT * FROM FlowData WHERE imagePath LIKE 'png_' || :name || '/%' AND imageType = 0") + @Delete + void delete(FlowData flowData); + + @Query("SELECT * FROM FlowData WHERE imagePath LIKE 'png_' || :name || '/%' AND imageType = 0 ORDER by id DESC") LiveData> getDataByName(String name); - @Query("SELECT * FROM FlowData WHERE id IN ( SELECT MIN(id) FROM FlowData WHERE imageType = 0 GROUP BY SUBSTR(ImagePath, 1, INSTR(ImagePath, '/') - 1))") + @Query("SELECT * FROM FlowData WHERE id IN ( SELECT Max(id) FROM FlowData WHERE imageType = 0 GROUP BY SUBSTR(ImagePath, 1, INSTR(ImagePath, '/') - 1))") LiveData> getMinId(); @Query("SELECT * FROM FlowData WHERE imageType = 1 ") diff --git a/app/src/main/java/com/ardraw/ardrawingflow/data/repository/FlowRepository.java b/app/src/main/java/com/ardraw/ardrawingflow/data/repository/FlowRepository.java index cec3075..e29033a 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/data/repository/FlowRepository.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/data/repository/FlowRepository.java @@ -23,7 +23,11 @@ public class FlowRepository { } public void insert(FlowData flowData) { - flowDataDao.insert(flowData); + executorService.execute(() -> flowDataDao.insert(flowData)); + } + + public void delete(FlowData flowData) { + executorService.execute(() -> flowDataDao.delete(flowData)); } public LiveData> getLike() { diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/DetailActivity.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/DetailActivity.java index f69b317..971ef62 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/DetailActivity.java @@ -11,6 +11,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; @@ -21,7 +22,6 @@ import androidx.activity.EdgeToEdge; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.camera.core.Camera; -import androidx.camera.core.CameraControl; import androidx.camera.core.CameraSelector; import androidx.camera.core.ImageCapture; import androidx.camera.core.ImageCaptureException; @@ -35,28 +35,31 @@ import androidx.core.view.WindowInsetsCompat; import com.ardraw.ardrawingflow.R; import com.ardraw.ardrawingflow.databinding.ActivityDetailBinding; -import com.ardraw.ardrawingflow.util.ImageManager; -import com.ardraw.ardrawingflow.util.PermissionsHelper; +import com.ardraw.ardrawingflow.util.FileUtil; +import com.ardraw.ardrawingflow.util.PermissionUtil; import com.google.common.util.concurrent.ListenableFuture; +import org.jetbrains.annotations.Nullable; + import java.util.concurrent.ExecutionException; -public class DetailActivity extends AppCompatActivity implements View.OnTouchListener, SeekBar.OnSeekBarChangeListener { +public class DetailActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener, View.OnTouchListener { private ActivityDetailBinding binding; - private static final int CAMERA_PERMISSION_REQUEST_CODE = 200; - private static final int STORAGE_PERMISSION_REQUEST_CODE = 201; - private static final int PICK_IMAGE_REQUEST_CODE = 202; + private static final int CAMERA_PERMISSION_REQUEST = 200; + private static final int STORAGE_PERMISSION_REQUEST = 201; + private static final int PICK_IMAGE_REQUEST = 202; - private final Matrix matrix = new Matrix(); - private final Matrix savedMatrix = new Matrix(); - private final PointF startPointF = new PointF(); - private float initialDistance; - private int mode = MODE_NONE; private static final int MODE_NONE = 0; private static final int MODE_DRAG = 1; private static final int MODE_ZOOM = 2; + private final Matrix matrix = new Matrix(); + private final Matrix savedMatrix = new Matrix(); + private final PointF startPoint = new PointF(); + private float initialDistance; + private int mode = MODE_NONE; + private boolean isFlash = false; private Camera camera; private ImageCapture imageCapture; @@ -74,175 +77,117 @@ public class DetailActivity extends AppCompatActivity implements View.OnTouchLis }); initData(); - initEvent(); + initEvents(); } private void initData() { - String imagePath = getIntent().getStringExtra("WallpaperPath"); + String imagePath = getIntent().getStringExtra("path"); if (imagePath == null) { finish(); return; } - ImageManager.loadImage(imagePath, binding.imageView, this, this); + FileUtil.loadImage(imagePath, binding.imageView, this); } - private void initEvent() { + private void initEvents() { binding.imageView.setOnTouchListener(this); - - setupListeners(); - checkPermissionsAndStartCamera(); - } - - private void setupListeners() { binding.seekbar.setOnSeekBarChangeListener(this); - binding.photo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openImagePicker(); - } - }); + binding.photo.setOnClickListener(v -> openImagePicker()); binding.flash.setOnClickListener(v -> toggleFlash()); - binding.back.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); + binding.back.setOnClickListener(v -> finish()); binding.camera.setOnClickListener(v -> takePhotoAndSave()); - binding.imageView.setOnTouchListener(this); + + checkPermissionsAndStartCamera(); } private void checkPermissionsAndStartCamera() { String[] permissions = getPermissions(); - if (PermissionsHelper.arePermissionsGranted(this, permissions)) { + if (PermissionUtil.hasPerms(this, permissions)) { initiateCamera(); } else { - PermissionsHelper.requestUserPermissions(this, permissions, CAMERA_PERMISSION_REQUEST_CODE); + PermissionUtil.reqPerms(this, permissions, CAMERA_PERMISSION_REQUEST); } } private void initiateCamera() { - ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(this); - cameraProviderFuture.addListener(() -> { + ListenableFuture future = ProcessCameraProvider.getInstance(this); + future.addListener(() -> { try { - ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); - setupCameraPreview(cameraProvider); - Preview cameraPreview = new Preview.Builder().build(); - cameraPreview.setSurfaceProvider(binding.preview.getSurfaceProvider()); + ProcessCameraProvider provider = future.get(); + Preview preview = new Preview.Builder().build(); + preview.setSurfaceProvider(binding.preview.getSurfaceProvider()); imageCapture = new ImageCapture.Builder().build(); + CameraSelector selector = new CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build(); - CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; - - cameraProvider.unbindAll(); - cameraProvider.bindToLifecycle(this, cameraSelector, cameraPreview, imageCapture); - - } catch (ExecutionException | InterruptedException e) { - e.printStackTrace(); + provider.unbindAll(); + camera = provider.bindToLifecycle(this, selector, preview, imageCapture); + } catch (ExecutionException | InterruptedException ignored) { } }, ContextCompat.getMainExecutor(this)); } - private void setupCameraPreview(@NonNull ProcessCameraProvider cameraProvider) { - Preview cameraPreview = new Preview.Builder().build(); - CameraSelector selector = new CameraSelector.Builder() - .requireLensFacing(CameraSelector.LENS_FACING_BACK) - .build(); - cameraPreview.setSurfaceProvider(binding.preview.getSurfaceProvider()); - cameraProvider.unbindAll(); - camera = cameraProvider.bindToLifecycle(this, selector, cameraPreview); - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { - if (PermissionsHelper.wasPermissionsGranted(grantResults)) { - initiateCamera(); - } else { - Toast.makeText(this, "Camera permissions are denied. Please go to Settings and enable the permissions.", Toast.LENGTH_SHORT).show(); - } - } else if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) { - if (PermissionsHelper.wasPermissionsGranted(grantResults)) { - openImagePicker(); - } else { - Toast.makeText(this, "Storage permission is denied. Please go to Settings and enable it.", Toast.LENGTH_SHORT).show(); - } + if (requestCode == CAMERA_PERMISSION_REQUEST && PermissionUtil.gotPerms(grantResults)) { + initiateCamera(); + } else if (requestCode == STORAGE_PERMISSION_REQUEST && PermissionUtil.gotPerms(grantResults)) { + openImagePicker(); + } else { + Toast.makeText(this, "Permission denied. Please enable it in Settings.", Toast.LENGTH_SHORT).show(); } } private void takePhotoAndSave() { if (imageCapture == null) { - Toast.makeText(this, "Camera is not initialized", Toast.LENGTH_SHORT).show(); + showToast("Camera not Init"); + return; + } + if (!hasCameraPermission()) { + requestCameraPermission(); return; } - if (!hasCameraPermissions()) { - requestCameraPermissions(); - return; - } - - ContentValues contentValues = prepareContentValues(); - - ImageCapture.OutputFileOptions outputOptions = new ImageCapture.OutputFileOptions.Builder( + ImageCapture.OutputFileOptions options = new ImageCapture.OutputFileOptions.Builder( getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - contentValues + prepareContentValues() ).build(); - imageCapture.takePicture( - outputOptions, - ContextCompat.getMainExecutor(this), - new ImageCapture.OnImageSavedCallback() { - @Override - public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) { - Toast.makeText(DetailActivity.this, "Photo saved to album", Toast.LENGTH_SHORT).show(); - } + imageCapture.takePicture(options, ContextCompat.getMainExecutor(this), new ImageCapture.OnImageSavedCallback() { + @Override + public void onImageSaved(@NonNull ImageCapture.OutputFileResults output) { + showToast("Successful photo shoot"); + } - @Override - public void onError(@NonNull ImageCaptureException exception) { - Toast.makeText(DetailActivity.this, "Photo capture failed: " + exception.getMessage(), Toast.LENGTH_SHORT).show(); - } - } - ); + @Override + public void onError(@NonNull ImageCaptureException exception) { + showToast("Photo shoot failed"); + } + }); } - private boolean hasCameraPermissions() { - return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; - } - - private void requestCameraPermissions() { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE); - } - - private ContentValues prepareContentValues() { - ContentValues contentValues = new ContentValues(); - contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "photo_" + System.currentTimeMillis() + ".jpg"); - contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); - contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); - return contentValues; - } - - private void openImagePicker() { - String[] permissions = PermissionsHelper.getRequiredStoragePermissions(); + String[] permissions = PermissionUtil.getStorePerms(); if (ContextCompat.checkSelfPermission(this, permissions[0]) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, permissions, STORAGE_PERMISSION_REQUEST_CODE); + ActivityCompat.requestPermissions(this, permissions, STORAGE_PERMISSION_REQUEST); } else { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE); + startActivityForResult(intent, PICK_IMAGE_REQUEST); } } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) { - Uri selectedImageUri = data.getData(); - if (selectedImageUri != null) { - binding.imageView.setImageURI(selectedImageUri); + if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) { + Uri imageUri = data.getData(); + if (imageUri != null) { + binding.imageView.setImageURI(imageUri); } } } @@ -263,61 +208,76 @@ public class DetailActivity extends AppCompatActivity implements View.OnTouchLis @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; + int action = event.getActionMasked(); - switch (event.getActionMasked()) { + switch (action) { case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); - startPointF.set(event.getX(), event.getY()); + startPoint.set(event.getX(), event.getY()); mode = MODE_DRAG; break; - case MotionEvent.ACTION_POINTER_DOWN: - initialDistance = ImageManager.calculateDistanceBetweenTouches(event); + initialDistance = FileUtil.calculateDistanceBetweenTouches(event); if (initialDistance > 10f) { savedMatrix.set(matrix); mode = MODE_ZOOM; } break; - case MotionEvent.ACTION_MOVE: if (mode == MODE_DRAG) { matrix.set(savedMatrix); - matrix.postTranslate(event.getX() - startPointF.x, event.getY() - startPointF.y); - } else if (mode == MODE_ZOOM) { - float newDistance = ImageManager.calculateDistanceBetweenTouches(event); - if (newDistance > 10f) { - float scale = newDistance / initialDistance; + matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y); + } else if (mode == MODE_ZOOM && event.getPointerCount() >= 2) { + float newDist = FileUtil.calculateDistanceBetweenTouches(event); + if (newDist > 10f) { + float scale = newDist / initialDistance; matrix.set(savedMatrix); matrix.postScale(scale, scale, view.getWidth() / 2f, view.getHeight() / 2f); } } break; - case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = MODE_NONE; break; } - view.setImageMatrix(matrix); return true; } + private void toggleFlash() { + if (camera != null) { + isFlash = !isFlash; + camera.getCameraControl().enableTorch(isFlash); + binding.flash.setImageResource(isFlash ? R.drawable.flash : R.drawable.disflash); + } + } + + private boolean hasCameraPermission() { + return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; + } + + private void requestCameraPermission() { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST); + } + + private ContentValues prepareContentValues() { + ContentValues values = new ContentValues(); + values.put(MediaStore.MediaColumns.DISPLAY_NAME, "photo_" + System.currentTimeMillis() + ".jpg"); + values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); + values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); + return values; + } + private String[] getPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_MEDIA_IMAGES}; - } else { - return new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; } + return new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; } - private void toggleFlash() { - if (camera != null) { - CameraControl cameraControl = camera.getCameraControl(); - isFlash = !isFlash; - cameraControl.enableTorch(isFlash); - binding.flash.setImageResource(isFlash ? R.drawable.flash : R.drawable.disflash); - } + private void showToast(String message) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } @Override diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/MainActivity.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/MainActivity.java index fc0dc9d..85e7dd6 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/MainActivity.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/MainActivity.java @@ -18,7 +18,7 @@ import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; public class MainActivity extends AppCompatActivity { - private com.ardraw.ardrawingflow.databinding.ActivityMainBinding viewBinding; + private ActivityMainBinding viewBinding; @Override protected void onCreate(Bundle savedInstanceState) { @@ -85,7 +85,6 @@ public class MainActivity extends AppCompatActivity { @Override public void onTabReselected(TabLayout.Tab tab) { - // No-op } private void refreshTabAppearance(TabLayout.Tab tab, boolean active) { @@ -112,10 +111,6 @@ public class MainActivity extends AppCompatActivity { int[] inactiveIcons = {R.drawable.discategory, R.drawable.disadd, R.drawable.disfavorite}; return active ? activeIcons[pos] : inactiveIcons[pos]; } - - private int fetchColor(int colorRes) { - return getResources().getColor(colorRes, null); - } }; } @@ -131,7 +126,7 @@ public class MainActivity extends AppCompatActivity { case 0: return new TabConfig(R.drawable.category, "Category", R.color.black); case 1: - return new TabConfig(R.drawable.add, "Add", R.color.gray); + return new TabConfig(R.drawable.disadd, "Upload", R.color.gray); case 2: return new TabConfig(R.drawable.disfavorite, "Favorite", R.color.gray); default: diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SecondActivity.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SecondActivity.java index cc4c8d3..4cad440 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SecondActivity.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SecondActivity.java @@ -45,7 +45,7 @@ public class SecondActivity extends AppCompatActivity { } private void initData() { - String path = getIntent().getStringExtra("Path"); + String path = getIntent().getStringExtra("path"); if (path == null) { finish(); return; @@ -57,7 +57,7 @@ public class SecondActivity extends AppCompatActivity { flowViewModel = new ViewModelProvider(this).get(FlowViewModel.class); binding.recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); - adapter = new FlowItemAdapter(this, new ArrayList<>(), 1); + adapter = new FlowItemAdapter(this, new ArrayList<>(), 2); binding.recyclerView.setAdapter(adapter); ItemDecoration itemDecoration = new ItemDecoration(35, 15, 20); diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SplashActivity.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SplashActivity.java index 47e319c..c846aca 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SplashActivity.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/activity/SplashActivity.java @@ -1,6 +1,8 @@ package com.ardraw.ardrawingflow.ui.activity; +import android.content.Intent; import android.os.Bundle; +import android.os.CountDownTimer; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -9,18 +11,65 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.ardraw.ardrawingflow.R; +import com.ardraw.ardrawingflow.databinding.ActivitySplashBinding; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; public class SplashActivity extends AppCompatActivity { + private ActivitySplashBinding binding; + private static final long TOTAL_TIME = 3000; + private CountDownTimer countDownTimer; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_splash); + + binding = ActivitySplashBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + Glide.with(this) + .load(R.mipmap.ic_launcher) + .transform(new RoundedCorners(16)) + .into(binding.splashImage); + + countDownTimer = new CountDownTimer(TOTAL_TIME, 100) { + @Override + public void onTick(long millisUntilFinished) { + int percentage = (int) (100 - (float) millisUntilFinished / TOTAL_TIME * 100); + binding.progressBar.setProgress(percentage); + } + + @Override + public void onFinish() { + startMain(); + } + }; + + countDownTimer.start(); + } + + private void startMain() { + binding.progressBar.setProgress(100); + + Intent intent = new Intent(SplashActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (countDownTimer != null) { + countDownTimer.cancel(); + } + binding = null; } } \ No newline at end of file diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/adapter/FlowItemAdapter.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/adapter/FlowItemAdapter.java index 2f1f993..bb93a9f 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/adapter/FlowItemAdapter.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/adapter/FlowItemAdapter.java @@ -12,7 +12,8 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.ardraw.ardrawingflow.R; -import com.ardraw.ardrawingflow.data.database.database.AppDatabase; +import com.ardraw.ardrawingflow.callback.DeleteCallback; +import com.ardraw.ardrawingflow.data.database.AppDatabase; import com.ardraw.ardrawingflow.data.database.entity.FlowData; import com.ardraw.ardrawingflow.ui.activity.DetailActivity; import com.ardraw.ardrawingflow.ui.activity.SecondActivity; @@ -28,6 +29,7 @@ public class FlowItemAdapter extends RecyclerView.Adapter dataItems; private final Context appContext; private final int displayMode; + private DeleteCallback deleteCallback; public FlowItemAdapter(Context appContext, List dataItems, int displayMode) { this.appContext = appContext; @@ -40,6 +42,10 @@ public class FlowItemAdapter extends RecyclerView.Adapter handleImageTap(item, mode)); favoriteIcon.setOnClickListener(view -> switchFavorite(item)); + deleteIcon.setOnClickListener(view ->{ + int position = getAdapterPosition(); + if (position != RecyclerView.NO_POSITION && deleteCallback != null) { + deleteCallback.onDelete(dataItems.get(position)); + } + }); } private void handleImageTap(FlowData item, int mode) { @@ -126,9 +142,8 @@ public class FlowItemAdapter extends RecyclerView.Adapter targetActivity = mode == 0 ? SecondActivity.class : DetailActivity.class; - String extraKey = mode == 0 ? "Path" : "WallpaperPath"; return new Intent(appContext, targetActivity) - .putExtra(extraKey, item.getImagePath()); + .putExtra("path", item.getImagePath()); } private void switchFavorite(FlowData item) { diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/AddFragment.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/AddFragment.java index b5aafe7..00d929d 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/AddFragment.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/AddFragment.java @@ -15,6 +15,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; +import com.ardraw.ardrawingflow.callback.DeleteCallback; import com.ardraw.ardrawingflow.data.database.entity.FlowData; import com.ardraw.ardrawingflow.databinding.FragmentAddBinding; import com.ardraw.ardrawingflow.ui.adapter.FlowItemAdapter; @@ -22,11 +23,10 @@ import com.ardraw.ardrawingflow.ui.viewmodel.FlowViewModel; import com.ardraw.ardrawingflow.util.UploadUtil; import com.ardraw.ardrawingflow.util.ItemDecoration; -import java.io.IOException; import java.util.ArrayList; import java.util.List; -public class AddFragment extends Fragment { +public class AddFragment extends Fragment implements DeleteCallback { private static final int PICK_IMAGE_REQUEST_CODE = 202; private FragmentAddBinding binding; private FlowItemAdapter adapter; @@ -51,6 +51,7 @@ public class AddFragment extends Fragment { adapter = new FlowItemAdapter(requireContext(), new ArrayList<>(), 1); binding.recyclerView.setAdapter(adapter); + adapter.setDeleteCallback(this); ItemDecoration itemDecoration = new ItemDecoration(35, 15, 20); binding.recyclerView.addItemDecoration(itemDecoration); @@ -69,13 +70,13 @@ public class AddFragment extends Fragment { .getAddLiveData() .observe(getViewLifecycleOwner(), new Observer>() { @Override - public void onChanged(List flowData) { - if (flowData.isEmpty()) { + public void onChanged(List flowDataList) { + if (flowDataList.isEmpty()) { binding.text.setVisibility(View.VISIBLE); } else { binding.text.setVisibility(View.GONE); } - adapter.refreshItems(flowData); + adapter.refreshItems(flowDataList); } }); } @@ -97,20 +98,17 @@ public class AddFragment extends Fragment { } private void processImage(Uri imageUri) { - try { - if (UploadUtil.isImageSizeValid(imageUri, requireContext())) { - UploadUtil.saveImage(imageUri, imagePaths, flowViewModel, requireContext(), requireActivity()); - } else { - showToast("The image size is out of limit"); - } - } catch (IOException e) { - e.printStackTrace(); - showToast("Could not get image size: " + e.getMessage()); + if (UploadUtil.isImageSizeValid(imageUri, requireContext())) { + UploadUtil.saveImage(imageUri, imagePaths, flowViewModel, requireContext()); + } else { + Toast.makeText(getContext(), "The image size is out of limit", Toast.LENGTH_SHORT).show(); } } - private void showToast(String message) { - Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); + @Override + public void onDelete(FlowData flowData) { + UploadUtil.deleteImage(flowData, flowViewModel, requireContext()); + loadAllImportImage(); } @Override @@ -118,5 +116,4 @@ public class AddFragment extends Fragment { super.onDestroy(); binding = null; } - } \ No newline at end of file diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/FavoriteFragment.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/FavoriteFragment.java index f42bf99..070a33b 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/FavoriteFragment.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/fragment/FavoriteFragment.java @@ -41,7 +41,7 @@ public class FavoriteFragment extends Fragment { binding.recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); - flowItemAdapter = new FlowItemAdapter(requireContext(), new ArrayList<>(), 0); + flowItemAdapter = new FlowItemAdapter(requireContext(), new ArrayList<>(), 2); binding.recyclerView.setAdapter(flowItemAdapter); ItemDecoration itemDecoration = new ItemDecoration(35, 15, 20); @@ -57,8 +57,13 @@ public class FavoriteFragment extends Fragment { .getLike() .observe(getViewLifecycleOwner(), new Observer>() { @Override - public void onChanged(List arData) { - flowItemAdapter.refreshItems(arData); + public void onChanged(List flowData) { + if (flowData.isEmpty()) { + binding.text.setVisibility(View.VISIBLE); + } else { + binding.text.setVisibility(View.GONE); + } + flowItemAdapter.refreshItems(flowData); } }); } diff --git a/app/src/main/java/com/ardraw/ardrawingflow/ui/viewmodel/FlowViewModel.java b/app/src/main/java/com/ardraw/ardrawingflow/ui/viewmodel/FlowViewModel.java index 9b451e2..32ffbfe 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/ui/viewmodel/FlowViewModel.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/ui/viewmodel/FlowViewModel.java @@ -7,7 +7,7 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import com.ardraw.ardrawingflow.data.database.dao.FlowDataDao; -import com.ardraw.ardrawingflow.data.database.database.AppDatabase; +import com.ardraw.ardrawingflow.data.database.AppDatabase; import com.ardraw.ardrawingflow.data.database.entity.FlowData; import com.ardraw.ardrawingflow.data.repository.FlowRepository; @@ -26,6 +26,10 @@ public class FlowViewModel extends AndroidViewModel { flowRepository.insert(flowData); } + public void delete(FlowData flowData) { + flowRepository.delete(flowData); + } + public LiveData> getLike() { return flowRepository.getLike(); } diff --git a/app/src/main/java/com/ardraw/ardrawingflow/util/ImageManager.java b/app/src/main/java/com/ardraw/ardrawingflow/util/FileUtil.java similarity index 57% rename from app/src/main/java/com/ardraw/ardrawingflow/util/ImageManager.java rename to app/src/main/java/com/ardraw/ardrawingflow/util/FileUtil.java index e92eba1..6095235 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/util/ImageManager.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/util/FileUtil.java @@ -1,32 +1,29 @@ package com.ardraw.ardrawingflow.util; -import android.app.Activity; import android.content.Context; -import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Point; -import android.util.DisplayMetrics; import android.view.MotionEvent; -import android.view.WindowManager; import android.widget.ImageView; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; -public class ImageManager { +public class FileUtil { public static float calculateDistanceBetweenTouches(MotionEvent event) { float deltaX = event.getX(1) - event.getX(0); float deltaY = event.getY(1) - event.getY(0); return (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY); } - public static void loadImage(String path, ImageView imageView, Context context, Activity activity) { + public static void loadImage(String path, ImageView imageView, Context context) { + if (path == null || imageView == null || context == null) return; + if (path.startsWith("/data/user/")) { loadImageFromStorage(path, imageView, context); } else { - loadImageFromAssets(path, activity, context, imageView); + loadImageFromAssets(path, imageView, context); } } @@ -39,29 +36,15 @@ public class ImageManager { } } - private static void loadImageFromAssets(String path, Activity activity, Context context, ImageView imageView) { - try { - AssetManager assetManager = activity.getAssets(); - InputStream inputStream = assetManager.open(path); + private static void loadImageFromAssets(String path, ImageView imageView, Context context) { + try (InputStream inputStream = context.getAssets().open(path)) { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imageView.setImageBitmap(bitmap); } catch (IOException e) { - e.printStackTrace(); - showToast(context, "Failed to load image from assets: " + e.getMessage()); + showToast(context, "Failed to load image from assets"); } } - private static Point getScreenSize(Context context) { - DisplayMetrics metrics = new DisplayMetrics(); - WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - if (windowManager != null) { - windowManager.getDefaultDisplay().getMetrics(metrics); - } - int width = metrics.widthPixels; - int height = metrics.heightPixels; - return new Point(width, height); - } - private static void showToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/com/ardraw/ardrawingflow/util/InitDatabase.java b/app/src/main/java/com/ardraw/ardrawingflow/util/InitDatabase.java index f04fe9b..6d3650f 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/util/InitDatabase.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/util/InitDatabase.java @@ -4,7 +4,7 @@ import android.content.Context; import android.content.res.AssetManager; import com.ardraw.ardrawingflow.data.database.dao.FlowDataDao; -import com.ardraw.ardrawingflow.data.database.database.AppDatabase; +import com.ardraw.ardrawingflow.data.database.AppDatabase; import com.ardraw.ardrawingflow.data.database.entity.FlowData; import com.ardraw.ardrawingflow.data.repository.FlowRepository; diff --git a/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionUtil.java b/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionUtil.java new file mode 100644 index 0000000..1bdeccd --- /dev/null +++ b/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionUtil.java @@ -0,0 +1,47 @@ +package com.ardraw.ardrawingflow.util; + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +public final class PermissionUtil { + + private PermissionUtil() { + } + + public static boolean hasPerms(Activity activity, String[] permissions) { + if (activity == null || permissions == null) return false; + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + public static void reqPerms(Activity activity, String[] permissions, int requestCode) { + if (activity != null && permissions != null) { + ActivityCompat.requestPermissions(activity, permissions, requestCode); + } + } + + public static boolean gotPerms(int[] grantResults) { + if (grantResults == null || grantResults.length == 0) return false; + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + public static String[] getStorePerms() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + ? new String[]{Manifest.permission.READ_MEDIA_IMAGES} + : new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } +} + diff --git a/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionsHelper.java b/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionsHelper.java deleted file mode 100644 index 223d66b..0000000 --- a/app/src/main/java/com/ardraw/ardrawingflow/util/PermissionsHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ardraw.ardrawingflow.util; - -import android.Manifest; -import android.app.Activity; -import android.content.pm.PackageManager; -import android.os.Build; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -public class PermissionsHelper { - public static boolean arePermissionsGranted(Activity activity, String[] permissions) { - for (String permission : permissions) { - if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { - return false; - } - } - return true; - } - - public static void requestUserPermissions(Activity activity, String[] permissions, int requestCode) { - ActivityCompat.requestPermissions(activity, permissions, requestCode); - } - - public static boolean wasPermissionsGranted(int[] grantResults) { - for (int result : grantResults) { - if (result != PackageManager.PERMISSION_GRANTED) { - return false; - } - } - return true; - } - - public static String[] getRequiredStoragePermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - return new String[]{Manifest.permission.READ_MEDIA_IMAGES}; - } else { - return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; - } - } -} - diff --git a/app/src/main/java/com/ardraw/ardrawingflow/util/UploadUtil.java b/app/src/main/java/com/ardraw/ardrawingflow/util/UploadUtil.java index c871563..3f85471 100644 --- a/app/src/main/java/com/ardraw/ardrawingflow/util/UploadUtil.java +++ b/app/src/main/java/com/ardraw/ardrawingflow/util/UploadUtil.java @@ -1,10 +1,11 @@ package com.ardraw.ardrawingflow.util; -import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Handler; +import android.os.Looper; import android.widget.Toast; import com.ardraw.ardrawingflow.data.database.entity.FlowData; @@ -17,38 +18,52 @@ import java.io.InputStream; import java.util.List; public class UploadUtil { + private static final Handler mainHandler = new Handler(Looper.getMainLooper()); - public static void saveImage(Uri imageUri, List imagePaths, FlowViewModel flowViewModel, Context appContext, Activity activity) { - try { - InputStream imageInputStream = appContext.getContentResolver().openInputStream(imageUri); - Bitmap imageBitmap = BitmapFactory.decodeStream(imageInputStream); + public static void saveImage(Uri imageUri, List imagePaths, FlowViewModel flowViewModel, Context context) { + if (imageUri == null || imagePaths == null || flowViewModel == null || context == null) + return; - if (imageBitmap == null) { - showToast(appContext, "Unable to load image"); + try (InputStream inputStream = context.getContentResolver().openInputStream(imageUri)) { + Bitmap bitmap = BitmapFactory.decodeStream(inputStream); + if (bitmap == null) { + showToast(context, "Unable to load image"); return; } - File storageDir = appContext.getFilesDir(); - File imageFile = new File(storageDir, generateUniqueImageName() + ".jpg"); - try (FileOutputStream imageOutputStream = new FileOutputStream(imageFile)) { - imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, imageOutputStream); + File imageFile = new File(context.getFilesDir(), generateUniqueImageName() + ".jpg"); + try (FileOutputStream outputStream = new FileOutputStream(imageFile)) { + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); } - imageInputStream.close(); String savedImagePath = imageFile.getAbsolutePath(); - - new Thread(() -> handleImageSaving(savedImagePath, imagePaths, flowViewModel, appContext, activity, imageFile)).start(); - + new Thread(() -> handleImageSaving(savedImagePath, imagePaths, flowViewModel, context, imageFile)).start(); } catch (IOException e) { - e.printStackTrace(); - showToast(appContext, "Failed to save picture: " + e.getMessage()); + showToast(context, "Failed to save picture"); } } - private static void handleImageSaving(String savedImagePath, List imagePaths, FlowViewModel flowViewModel, Context appContext, Activity activity, File imageFile) { + public static void deleteImage(FlowData flowData, FlowViewModel flowViewModel, Context context) { + if (flowData.getImagePath() == null || flowViewModel == null || context == null) return; + + File imageFile = new File(flowData.getImagePath()); + if (!imageFile.exists()) { + showToast(context, "Image does not exist"); + return; + } + + if (imageFile.delete()) { + flowViewModel.delete(flowData); + showToast(context, "Image deleted successfully"); + } else { + showToast(context, "Failed to delete image"); + } + } + + private static void handleImageSaving(String savedImagePath, List imagePaths, FlowViewModel flowViewModel, Context context, File imageFile) { if (isImageAlreadyPresent(savedImagePath, imagePaths, flowViewModel)) { - activity.runOnUiThread(() -> showToast(appContext, "The image already exists")); imageFile.delete(); + showToast(context, "The image already exists"); return; } @@ -58,6 +73,7 @@ public class UploadUtil { private static boolean isImageAlreadyPresent(String imagePath, List imagePaths, FlowViewModel flowViewModel) { File newImageFile = new File(imagePath); + if (!newImageFile.exists()) return false; for (String path : imagePaths) { File existingFile = new File(path); @@ -66,40 +82,40 @@ public class UploadUtil { } } - List flowData = flowViewModel.getAdd(); - for (FlowData flowData1 : flowData) { - File existingFile = new File(flowData1.getImagePath()); + List flowDataList = flowViewModel.getAdd(); + for (FlowData data : flowDataList) { + File existingFile = new File(data.getImagePath()); if (isFileSizeMatching(existingFile, newImageFile)) { return true; } } - return false; } private static boolean isFileSizeMatching(File file1, File file2) { - return file1.length() == file2.length(); + return file1.exists() && file2.exists() && file1.length() == file2.length(); } private static void showToast(Context context, String message) { - Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + if (context == null || message == null) return; + mainHandler.post(() -> Toast.makeText(context, message, Toast.LENGTH_SHORT).show()); } private static String generateUniqueImageName() { return String.valueOf(System.currentTimeMillis()); } - public static boolean isImageSizeValid(Uri imageUri, Context context) throws IOException { - InputStream imageInputStream = context.getContentResolver().openInputStream(imageUri); - if (imageInputStream == null) { + public static boolean isImageSizeValid(Uri imageUri, Context context) { + if (imageUri == null || context == null) return false; + + try (InputStream inputStream = context.getContentResolver().openInputStream(imageUri)) { + if (inputStream == null) return false; + long imageSize = inputStream.available(); + long maxSize = 10 * 1024 * 1024; + return imageSize <= maxSize; + } catch (IOException e) { return false; } - - long imageSize = imageInputStream.available(); - imageInputStream.close(); - long maxSize = 10 * 1024 * 1024; - - return imageSize <= maxSize; } } diff --git a/app/src/main/res/drawable/add.xml b/app/src/main/res/drawable/add.xml index d72665f..0138fa3 100644 --- a/app/src/main/res/drawable/add.xml +++ b/app/src/main/res/drawable/add.xml @@ -4,9 +4,9 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml index 1882c93..23ebb69 100644 --- a/app/src/main/res/drawable/back.xml +++ b/app/src/main/res/drawable/back.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/camera.xml b/app/src/main/res/drawable/camera.xml index 62a7760..8665f11 100644 --- a/app/src/main/res/drawable/camera.xml +++ b/app/src/main/res/drawable/camera.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/category.xml b/app/src/main/res/drawable/category.xml index 85854ce..45e4c8b 100644 --- a/app/src/main/res/drawable/category.xml +++ b/app/src/main/res/drawable/category.xml @@ -4,15 +4,15 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/delete.xml b/app/src/main/res/drawable/delete.xml new file mode 100644 index 0000000..2bff889 --- /dev/null +++ b/app/src/main/res/drawable/delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/disadd.xml b/app/src/main/res/drawable/disadd.xml index a8b409b..49ef251 100644 --- a/app/src/main/res/drawable/disadd.xml +++ b/app/src/main/res/drawable/disadd.xml @@ -1,4 +1,12 @@ - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/discategory.xml b/app/src/main/res/drawable/discategory.xml index a8b409b..5aaaa12 100644 --- a/app/src/main/res/drawable/discategory.xml +++ b/app/src/main/res/drawable/discategory.xml @@ -1,4 +1,18 @@ - - - - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/disfavorite.xml b/app/src/main/res/drawable/disfavorite.xml index a8b409b..53c6deb 100644 --- a/app/src/main/res/drawable/disfavorite.xml +++ b/app/src/main/res/drawable/disfavorite.xml @@ -1,4 +1,12 @@ - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/disflash.xml b/app/src/main/res/drawable/disflash.xml index 2bcc1ac..d6bf9d8 100644 --- a/app/src/main/res/drawable/disflash.xml +++ b/app/src/main/res/drawable/disflash.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="#6CE89E"/> diff --git a/app/src/main/res/drawable/favorite.xml b/app/src/main/res/drawable/favorite.xml index 4fb8948..b2105ca 100644 --- a/app/src/main/res/drawable/favorite.xml +++ b/app/src/main/res/drawable/favorite.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:fillColor="@color/black"/> + android:fillColor="@color/black"/> diff --git a/app/src/main/res/drawable/flash.xml b/app/src/main/res/drawable/flash.xml index 87706d7..50f70b9 100644 --- a/app/src/main/res/drawable/flash.xml +++ b/app/src/main/res/drawable/flash.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="#6CE89E"/> diff --git a/app/src/main/res/drawable/photo.xml b/app/src/main/res/drawable/photo.xml index ba53c87..024ab67 100644 --- a/app/src/main/res/drawable/photo.xml +++ b/app/src/main/res/drawable/photo.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/progress_thumb.xml b/app/src/main/res/drawable/progress_thumb.xml index 71213e0..1b306d6 100644 --- a/app/src/main/res/drawable/progress_thumb.xml +++ b/app/src/main/res/drawable/progress_thumb.xml @@ -1,7 +1,7 @@ - + + app:layout_constraintBottom_toBottomOf="@+id/photo" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/camera" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add.xml b/app/src/main/res/layout/fragment_add.xml index 3ee5223..9517229 100644 --- a/app/src/main/res/layout/fragment_add.xml +++ b/app/src/main/res/layout/fragment_add.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginBottom="5dp" - app:layout_constraintBottom_toTopOf="@+id/add" + app:layout_constraintBottom_toTopOf="@+id/upload" app:layout_constraintTop_toTopOf="parent" /> - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_flow.xml b/app/src/main/res/layout/item_flow.xml index a002fb8..d1c54cf 100644 --- a/app/src/main/res/layout/item_flow.xml +++ b/app/src/main/res/layout/item_flow.xml @@ -4,7 +4,7 @@ android:layout_height="200dp"> + +