diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 84157c9..97b604d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { minSdk = 26 //noinspection OldTargetApi targetSdk = 34 - versionCode = 6 - versionName = "1.4.1" + versionCode = 7 + versionName = "1.4.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 881f6a9..57dd9a9 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 4, - "versionName": "1.3", + "versionCode": 6, + "versionName": "1.4.1", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/devs/org/calculator/activities/HiddenActivity.kt b/app/src/main/java/devs/org/calculator/activities/HiddenActivity.kt index 925d6f0..fa9affb 100644 --- a/app/src/main/java/devs/org/calculator/activities/HiddenActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/HiddenActivity.kt @@ -11,7 +11,10 @@ import android.view.WindowManager import android.widget.EditText import android.widget.Toast import androidx.activity.OnBackPressedCallback +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import devs.org.calculator.R @@ -47,7 +50,12 @@ class HiddenActivity : AppCompatActivity() { fileManager = FileManager(this, this) folderManager = FolderManager() dialogUtil = DialogUtil(this) - + enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } setupInitialUIState() setupClickListeners() diff --git a/app/src/main/java/devs/org/calculator/activities/MainActivity.kt b/app/src/main/java/devs/org/calculator/activities/MainActivity.kt index 8ff3f19..b9eb7be 100644 --- a/app/src/main/java/devs/org/calculator/activities/MainActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/MainActivity.kt @@ -24,6 +24,10 @@ import devs.org.calculator.utils.PrefsUtil import net.objecthunter.exp4j.ExpressionBuilder import java.util.regex.Pattern import androidx.core.content.edit +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import devs.org.calculator.utils.StoragePermissionUtil class MainActivity : AppCompatActivity(), DialogActionsCallback, DialogUtil.DialogCallback { private lateinit var binding: ActivityMainBinding @@ -36,6 +40,8 @@ class MainActivity : AppCompatActivity(), DialogActionsCallback, DialogUtil.Dial private val dialogUtil = DialogUtil(this) private val fileManager = FileManager(this, this) private val sp by lazy { getSharedPreferences("app", MODE_PRIVATE) } + private lateinit var storagePermissionUtil: StoragePermissionUtil + private lateinit var permissionLauncher: ActivityResultLauncher> @RequiresApi(Build.VERSION_CODES.R) override fun onCreate(savedInstanceState: Bundle?) { @@ -43,15 +49,30 @@ class MainActivity : AppCompatActivity(), DialogActionsCallback, DialogUtil.Dial binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom) + insets + } + + permissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + storagePermissionUtil.handlePermissionResult(permissions) + } + + // Initialize StoragePermissionUtil + storagePermissionUtil = StoragePermissionUtil(this) + launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> handleActivityResult(result) } - if (sp.getBoolean("isFirst", true)){ binding.display.text = getString(R.string.enter_123456) } - if(!Environment.isExternalStorageManager()) { + + if (!storagePermissionUtil.hasStoragePermission()) { dialogUtil.showMaterialDialog( getString(R.string.storage_permission), getString(R.string.to_ensure_the_app_works_properly_and_allows_you_to_easily_hide_or_un_hide_your_private_files_please_grant_storage_access_permission) + @@ -61,7 +82,10 @@ class MainActivity : AppCompatActivity(), DialogActionsCallback, DialogUtil.Dial getString(R.string.later), object : DialogUtil.DialogCallback { override fun onPositiveButtonClicked() { - fileManager.askPermission(this@MainActivity) + storagePermissionUtil.requestStoragePermission(permissionLauncher) { + Toast.makeText(this@MainActivity, getString(R.string.permission_granted), Toast.LENGTH_SHORT).show() + } + } override fun onNegativeButtonClicked() { @@ -75,9 +99,11 @@ class MainActivity : AppCompatActivity(), DialogActionsCallback, DialogUtil.Dial getString(R.string.you_can_grant_permission_later_from_settings), Toast.LENGTH_LONG).show() } - } - ) + }) } + + + setupNumberButton(binding.btn0, "0") setupNumberButton(binding.btn00, "00") setupNumberButton(binding.btn1, "1") diff --git a/app/src/main/java/devs/org/calculator/activities/PreviewActivity.kt b/app/src/main/java/devs/org/calculator/activities/PreviewActivity.kt index 9aacd87..ab830e9 100644 --- a/app/src/main/java/devs/org/calculator/activities/PreviewActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/PreviewActivity.kt @@ -6,7 +6,10 @@ import android.os.Handler import android.os.Looper import android.view.WindowManager import android.widget.Toast +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import devs.org.calculator.R @@ -42,7 +45,12 @@ class PreviewActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityPreviewBinding.inflate(layoutInflater) setContentView(binding.root) - + enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } fileManager = FileManager(this, this) currentPosition = intent.getIntExtra("position", 0) diff --git a/app/src/main/java/devs/org/calculator/activities/SettingsActivity.kt b/app/src/main/java/devs/org/calculator/activities/SettingsActivity.kt index 036e807..ae62c3f 100644 --- a/app/src/main/java/devs/org/calculator/activities/SettingsActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/SettingsActivity.kt @@ -6,9 +6,12 @@ import android.view.View import android.view.WindowManager import android.widget.EditText import android.widget.Toast +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.net.toUri +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import com.google.android.material.color.DynamicColors import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar @@ -29,6 +32,12 @@ class SettingsActivity : AppCompatActivity() { binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) prefs = PrefsUtil(this) + enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } DEV_GITHUB_URL = getString(R.string.github_profile) GITHUB_URL = getString(R.string.calculator_hide_files, DEV_GITHUB_URL) setupUI() diff --git a/app/src/main/java/devs/org/calculator/activities/SetupPasswordActivity.kt b/app/src/main/java/devs/org/calculator/activities/SetupPasswordActivity.kt index 86bd32f..ea211f9 100644 --- a/app/src/main/java/devs/org/calculator/activities/SetupPasswordActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/SetupPasswordActivity.kt @@ -5,7 +5,10 @@ import android.os.Bundle import android.view.LayoutInflater import android.widget.TextView import android.widget.Toast +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import com.google.android.material.color.DynamicColors import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText @@ -26,7 +29,12 @@ class SetupPasswordActivity : AppCompatActivity() { binding = ActivitySetupPasswordBinding.inflate(layoutInflater) binding2 = ActivityChangePasswordBinding.inflate(layoutInflater) setContentView(binding.root) - + enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } prefsUtil = PrefsUtil(this) hasPassword = prefsUtil.hasPassword() diff --git a/app/src/main/java/devs/org/calculator/activities/ViewFolderActivity.kt b/app/src/main/java/devs/org/calculator/activities/ViewFolderActivity.kt index 06ec2fe..1e96d17 100644 --- a/app/src/main/java/devs/org/calculator/activities/ViewFolderActivity.kt +++ b/app/src/main/java/devs/org/calculator/activities/ViewFolderActivity.kt @@ -40,6 +40,9 @@ import android.widget.CheckBox import android.widget.CompoundButton import android.app.AlertDialog import android.view.WindowManager +import androidx.activity.enableEdgeToEdge +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import devs.org.calculator.adapters.FileAdapter class ViewFolderActivity : AppCompatActivity() { @@ -71,6 +74,12 @@ class ViewFolderActivity : AppCompatActivity() { binding = ActivityViewFolderBinding.inflate(layoutInflater) setContentView(binding.root) + enableEdgeToEdge() + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } setupAnimations() initialize() setupClickListeners() diff --git a/app/src/main/java/devs/org/calculator/utils/StoragePermissionUtil.kt b/app/src/main/java/devs/org/calculator/utils/StoragePermissionUtil.kt index 2bf198e..a6e7e8d 100644 --- a/app/src/main/java/devs/org/calculator/utils/StoragePermissionUtil.kt +++ b/app/src/main/java/devs/org/calculator/utils/StoragePermissionUtil.kt @@ -7,6 +7,7 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.provider.Settings +import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat @@ -15,20 +16,15 @@ import androidx.core.content.PermissionChecker import androidx.core.net.toUri class StoragePermissionUtil(private val activity: AppCompatActivity) { - - private val requestPermissionLauncher = activity.registerForActivityResult( - ActivityResultContracts.RequestMultiplePermissions() - ) { permissions -> - if (permissions.all { it.value }) { - onPermissionGranted?.invoke() - } - } private var onPermissionGranted: (() -> Unit)? = null - fun requestStoragePermission(onGranted: () -> Unit) { + fun requestStoragePermission( + launcher: ActivityResultLauncher>, + onGranted: () -> Unit + ) { onPermissionGranted = onGranted - + when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { if (Environment.isExternalStorageManager()) { @@ -45,7 +41,7 @@ class StoragePermissionUtil(private val activity: AppCompatActivity) { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) - requestPermissionLauncher.launch(permissions) + launcher.launch(permissions) } } } @@ -66,4 +62,10 @@ class StoragePermissionUtil(private val activity: AppCompatActivity) { writePermission == PermissionChecker.PERMISSION_GRANTED } } -} \ No newline at end of file + + fun handlePermissionResult(permissions: Map) { + if (permissions.all { it.value }) { + onPermissionGranted?.invoke() + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_change_password.xml b/app/src/main/res/layout/activity_change_password.xml index e6f87e0..e228ef5 100644 --- a/app/src/main/res/layout/activity_change_password.xml +++ b/app/src/main/res/layout/activity_change_password.xml @@ -5,74 +5,86 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="16dp" tools:context=".activities.SetupPasswordActivity"> - + app:layout_constraintTop_toTopOf="parent"> - + - - + android:layout_marginTop="32dp" + android:hint="@string/enter_old_password" + app:endIconMode="password_toggle" + app:layout_constraintTop_toBottomOf="@id/tvTitle"> - + + - - + android:layout_marginTop="16dp" + android:hint="@string/enter_new_password" + app:endIconMode="password_toggle" + app:layout_constraintTop_toBottomOf="@id/tilOldPassword"> - + + - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preview.xml b/app/src/main/res/layout/activity_preview.xml index f5abfcd..f014411 100644 --- a/app/src/main/res/layout/activity_preview.xml +++ b/app/src/main/res/layout/activity_preview.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index fd41efc..1306ebd 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:id="@+id/main" android:layout_height="match_parent" tools:context=".activities.SettingsActivity"> diff --git a/app/src/main/res/layout/activity_setup_password.xml b/app/src/main/res/layout/activity_setup_password.xml index ebc5c41..e223c6d 100644 --- a/app/src/main/res/layout/activity_setup_password.xml +++ b/app/src/main/res/layout/activity_setup_password.xml @@ -5,104 +5,116 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="16dp" tools:context=".activities.SetupPasswordActivity"> - + app:layout_constraintTop_toTopOf="parent"> - - + + - + android:layout_marginTop="32dp" + android:hint="@string/enter_password" + app:endIconMode="password_toggle" + app:layout_constraintTop_toBottomOf="@id/tvTitle"> - + + - - + android:layout_marginTop="16dp" + android:hint="@string/confirm_password" + app:endIconMode="password_toggle" + app:layout_constraintTop_toBottomOf="@id/tilPassword"> - + + - - + android:layout_marginTop="16dp" + android:hint="@string/security_question_for_password_reset" + app:layout_constraintTop_toBottomOf="@id/tilConfirmPassword"> - + + - - + android:layout_marginTop="16dp" + android:hint="@string/security_answer" + app:layout_constraintTop_toBottomOf="@id/tilSecurityQuestion"> - + + - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_folder_selection.xml b/app/src/main/res/layout/bottom_sheet_folder_selection.xml index 6efb3bb..428bd33 100644 --- a/app/src/main/res/layout/bottom_sheet_folder_selection.xml +++ b/app/src/main/res/layout/bottom_sheet_folder_selection.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:padding="16dp">