From a3a9916c28a9f578c9c83db49ad19b2521436365 Mon Sep 17 00:00:00 2001 From: elaraaj <91123185+theftzoku@users.noreply.github.com> Date: Mon, 11 Nov 2024 18:11:44 +0000 Subject: [PATCH] Merge remote-tracking branch 'origin/development' into development --- .idea/kotlinc.xml | 2 +- ...inflater_asynclayoutinflater_1_0_0_aar.xml | 4 +- ...__androidx_cardview_cardview_1_0_0_aar.xml | 6 +- ...atorlayout_coordinatorlayout_1_1_0_aar.xml | 8 +- ..._cursoradapter_cursoradapter_1_0_0_aar.xml | 4 +- ...dx_documentfile_documentfile_1_0_0_aar.xml | 4 +- ...dx_interpolator_interpolator_1_0_0_aar.xml | 4 +- ...egacy_legacy_support_core_ui_1_0_0_aar.xml | 4 +- ...cy_legacy_support_core_utils_1_0_0_aar.xml | 4 +- ...idx_legacy_legacy_support_v4_1_0_0_aar.xml | 4 +- ...adle__androidx_loader_loader_1_0_0_aar.xml | 4 +- ...anager_localbroadcastmanager_1_0_0_aar.xml | 4 +- ...Gradle__androidx_media_media_1_0_0_aar.xml | 8 +- ...Gradle__androidx_print_print_1_0_0_aar.xml | 6 +- ...dx_recyclerview_recyclerview_1_1_0_aar.xml | 8 +- ...panelayout_slidingpanelayout_1_0_0_aar.xml | 4 +- ...eshlayout_swiperefreshlayout_1_0_0_aar.xml | 6 +- ...ectordrawable_vectordrawable_1_1_0_aar.xml | 4 +- ...able_vectordrawable_animated_1_1_0_aar.xml | 4 +- ...droidx_viewpager2_viewpager2_1_0_0_aar.xml | 8 +- ...androidx_viewpager_viewpager_1_0_0_aar.xml | 4 +- ...thub_PhilJay_MPAndroidChart_v3_1_0_aar.xml | 4 +- ...aredrummler_material_spinner_1_3_1_aar.xml | 6 +- ...de_hdodenhof_circleimageview_3_1_0_aar.xml | 6 +- .idea/modules.xml | 6 +- app/build.gradle | 5 +- app/src/main/AndroidManifest.xml | 11 + .../java/rocks/poopjournal/todont/About.java | 41 +- .../todont/Adapters/AvoidedAdapter.java | 109 +--- .../todont/Adapters/AvoidedLogAdapter.java | 433 ++++++++++++--- .../todont/Adapters/DoneAdapter.java | 97 +--- .../todont/Adapters/DoneLogAdapter.java | 424 +++++++++++++-- .../todont/Adapters/HabitsAdapter.java | 514 +++++++++++++++--- .../todont/Adapters/HabitsLogAdapter.java | 458 +++++++++++++--- .../java/rocks/poopjournal/todont/Alarm.java | 50 ++ .../poopjournal/todont/DatabaseManager.java | 73 +++ .../poopjournal/todont/DatabaseUtils.java | 92 ++++ .../poopjournal/todont/Db_Controller.java | 98 +++- .../rocks/poopjournal/todont/Db_Helper.java | 244 +++++++++ .../todont/Fragments/AvoidedFragment.java | 16 +- .../todont/Fragments/AvoidedLogFragment.java | 9 - .../todont/Fragments/DoneFragment.java | 11 +- .../todont/Fragments/FragmentLog.java | 1 - .../todont/Fragments/FragmentToday.java | 4 - .../todont/Fragments/HabitsFragment.java | 84 +-- .../todont/Fragments/HabitsLogFragment.java | 24 - .../todont/Fragments/LabelsAdapter.java | 10 +- .../todont/Fragments/MonthlyFragment.java | 5 +- .../todont/Fragments/WeeklyFragment.java | 6 +- .../todont/Fragments/YearlyFragment.java | 7 +- .../todont/Fragments/menuFragment.java | 20 +- .../java/rocks/poopjournal/todont/Helper.java | 4 +- .../java/rocks/poopjournal/todont/Labels.java | 73 +-- .../rocks/poopjournal/todont/MainActivity.kt | 63 ++- .../todont/NotificationReceiver.java | 43 ++ .../todont/OnBoardingActivity.java | 9 +- .../rocks/poopjournal/todont/Settings.java | 400 ++++++++++---- .../poopjournal/todont/Splash_Screen.java | 1 - .../poopjournal/todont/utils/Constant.java | 1 - .../todont/utils/SharedPrefUtils.java | 10 + .../rocks/poopjournal/todont/utils/Utils.java | 5 +- app/src/main/res/drawable/bell.xml | 20 + app/src/main/res/drawable/bottom_sheet.xml | 1 - app/src/main/res/drawable/dis.xml | 13 + app/src/main/res/layout/activity_about.xml | 212 ++++---- app/src/main/res/layout/activity_settings.xml | 18 +- .../main/res/layout/fab_description_view.xml | 11 - app/src/main/res/layout/fragment_habits.xml | 13 - .../res/layout/recyclerview_layout_habits.xml | 35 +- .../update_layout_bottom_sheet_test.xml | 163 +++--- build.gradle | 1 + 71 files changed, 3033 insertions(+), 1035 deletions(-) create mode 100644 app/src/main/java/rocks/poopjournal/todont/Alarm.java create mode 100644 app/src/main/java/rocks/poopjournal/todont/DatabaseManager.java create mode 100644 app/src/main/java/rocks/poopjournal/todont/DatabaseUtils.java create mode 100644 app/src/main/java/rocks/poopjournal/todont/Db_Helper.java create mode 100644 app/src/main/java/rocks/poopjournal/todont/NotificationReceiver.java create mode 100644 app/src/main/res/drawable/bell.xml create mode 100644 app/src/main/res/drawable/dis.xml diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 6d0ee1c2..d4b7accb 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml index 5257e386..3bab6da7 100644 --- a/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml index 48a27f31..84e6a9de 100644 --- a/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml index a4fc9feb..3770ab2f 100644 --- a/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml index fc0f2f7d..4a48314b 100644 --- a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml index a7d7e93f..be019a6c 100644 --- a/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml index 5e023a96..cb7c7f10 100644 --- a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml index 97dede46..3929decc 100644 --- a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml index bae5567a..8cc2145b 100644 --- a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml index 9ef4fc0d..e4e3f039 100644 --- a/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_v4_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml index 2718db62..2728cf67 100644 --- a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml index f94d91d7..b34f5cc1 100644 --- a/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml index 8df46097..bb29a77d 100644 --- a/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_media_media_1_0_0_aar.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml index af9cd3c2..0b1188c4 100644 --- a/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml index a312ef85..8336346e 100644 --- a/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml index 0d807f32..cbfdca32 100644 --- a/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml index 49a07f66..e2d61d00 100644 --- a/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml @@ -1,11 +1,11 @@ - + - - + + diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml index 12c1acb1..86f09b5c 100644 --- a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml index 40c5b258..ffae872a 100644 --- a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml index 34221018..8dd8f993 100644 --- a/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml index e09ffe3e..da4a3664 100644 --- a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +++ b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__com_github_PhilJay_MPAndroidChart_v3_1_0_aar.xml b/.idea/libraries/Gradle__com_github_PhilJay_MPAndroidChart_v3_1_0_aar.xml index 95228de1..83a2e3b5 100644 --- a/.idea/libraries/Gradle__com_github_PhilJay_MPAndroidChart_v3_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_github_PhilJay_MPAndroidChart_v3_1_0_aar.xml @@ -1,8 +1,8 @@ - - + + diff --git a/.idea/libraries/Gradle__com_jaredrummler_material_spinner_1_3_1_aar.xml b/.idea/libraries/Gradle__com_jaredrummler_material_spinner_1_3_1_aar.xml index 6808240e..839ff95d 100644 --- a/.idea/libraries/Gradle__com_jaredrummler_material_spinner_1_3_1_aar.xml +++ b/.idea/libraries/Gradle__com_jaredrummler_material_spinner_1_3_1_aar.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/.idea/libraries/Gradle__de_hdodenhof_circleimageview_3_1_0_aar.xml b/.idea/libraries/Gradle__de_hdodenhof_circleimageview_3_1_0_aar.xml index 4a919ea3..7b8b6419 100644 --- a/.idea/libraries/Gradle__de_hdodenhof_circleimageview_3_1_0_aar.xml +++ b/.idea/libraries/Gradle__de_hdodenhof_circleimageview_3_1_0_aar.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/.idea/modules.xml b/.idea/modules.xml index 6aea7b9f..a2717ef4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,10 +2,10 @@ - - - + + + diff --git a/app/build.gradle b/app/build.gradle index 98623d88..d3ce95fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,6 @@ plugins { // id 'kotlin-parcelize' } - android { namespace 'rocks.poopjournal.todont' compileSdk 35 @@ -64,11 +63,14 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.13.1' + implementation 'androidx.core:core:1.10.1' // Check for the latest version + implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.leanback:leanback:1.0.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' @@ -82,5 +84,6 @@ dependencies { implementation 'de.hdodenhof:circleimageview:3.1.0' //noinspection GradleCompatible implementation 'com.android.support:cardview-v7:28.0.0' + implementation("com.github.mreram:showcaseview:1.4.1") } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0bb30127..404c9859 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,11 +3,21 @@ xmlns:tools="http://schemas.android.com/tools" package="rocks.poopjournal.todont"> + + + + + + + + + + diff --git a/app/src/main/java/rocks/poopjournal/todont/About.java b/app/src/main/java/rocks/poopjournal/todont/About.java index 00e1aa15..4bef03e5 100644 --- a/app/src/main/java/rocks/poopjournal/todont/About.java +++ b/app/src/main/java/rocks/poopjournal/todont/About.java @@ -1,25 +1,62 @@ package rocks.poopjournal.todont; -import androidx.appcompat.app.AppCompatActivity; - import android.annotation.SuppressLint; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.view.MotionEvent; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; + +import rocks.poopjournal.todont.utils.SharedPrefUtils; +import smartdevelop.ir.eram.showcaseviewlib.GuideView; +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType; +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity; +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType; +import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener; + public class About extends AppCompatActivity { TextView version; + private LinearLayout contributionView; + private SharedPrefUtils prefUtils; @SuppressLint("SetTextI18n") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); + contributionView=findViewById(R.id.contributionView); version=findViewById(R.id.versiontext); version.setText( BuildConfig.VERSION_NAME +" Beta "); + + prefUtils=new SharedPrefUtils(this); + contributionView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if(!prefUtils.getBool(SharedPrefUtils.KEY_CONTRIBUTION_VIEW)){ + GuideView.Builder guideView = new GuideView.Builder(About.this) + .setContentText("Help make \"To Don't\" better.") + .setTargetView(contributionView) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool(SharedPrefUtils.KEY_CONTRIBUTION_VIEW, true); + } + }); + guideView.build().show(); + return true; + } + return false; + } + }); + //tabdeeli aa gai hai } public void contact_codeaquaria(View view) { diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedAdapter.java index 82004df5..0b4cc890 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedAdapter.java @@ -1,39 +1,24 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.database.sqlite.SQLiteException; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.bottomsheet.BottomSheetDialog; - import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Locale; -import rocks.poopjournal.todont.Fragments.AvoidedFragment; import rocks.poopjournal.todont.Db_Controller; +import rocks.poopjournal.todont.Fragments.AvoidedFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; import rocks.poopjournal.todont.R; @@ -47,7 +32,7 @@ public class AvoidedAdapter extends RecyclerView.Adapter donotTask, ArrayList donotCatagory) { @@ -61,100 +46,22 @@ public AvoidedAdapter(Context con, AvoidedFragment ft, Db_Controller db, ArrayLi @NonNull @Override - public AvoidedAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.recyclerview_layout, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull AvoidedAdapter.RecyclerViewHolder holder, final int position) { - db.show_data(); + public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) { + db.show_avoided_data(); String dTask = donotTask.get(position); - String date = Helper.data.get(position)[1]; - String tim = Helper.data.get(position)[4]; + String date = Helper.avoidedData.get(position)[1]; + String tim = Helper.avoidedData.get(position)[4]; holder.tim.setText(tim+ "-Times"); holder.task.setText(dTask); holder.dateoftask.setText(date); - holder.task.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, - R.style.BottomSheetDialogTheme); - final View bottomsheetview = LayoutInflater.from(con.getApplicationContext()). - inflate(R.layout.update_layout_bottom_sheet_test, - view.findViewById(R.id.bottomsheetContainer)); - final Spinner spinner = bottomsheetview.findViewById(R.id.updatespinner); - Button saveTaskButton = bottomsheetview.findViewById(R.id.updateTaskButton); - final EditText habit = bottomsheetview.findViewById(R.id.updatehabit); - final EditText detail = bottomsheetview.findViewById(R.id.updatedetail); - TextView txt=bottomsheetview.findViewById(R.id.txt); - if (Helper.labels_array.size() == 0) { - txt.setVisibility(View.VISIBLE); - spinner.setVisibility(View.INVISIBLE); - } else { - txt.setVisibility(View.INVISIBLE); - spinner.setVisibility(View.VISIBLE); - } - habit.setText("" + Helper.data.get(position)[2]); - detail.setText("" + Helper.habitsdata.get(position)[3].replace("''","'")); - - ArrayList reformed_labels = new ArrayList<>(); - for (int i=0;i(con, android.R.layout.simple_list_item_1, - reformed_labels) { - @Override - public boolean isEnabled(int position) { - return position != 0; - } - }; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - catagoryselected = adapterView.getItemAtPosition(i).toString().replace("'","''"); - TextView selectedText = (TextView) adapterView.getChildAt(i); - if (selectedText != null) { - selectedText.setTextColor(ContextCompat.getColor(con,R.color.g2)); - } - } - - @Override - public void onNothingSelected(AdapterView adapterView) { - - } - }); - - - saveTaskButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - String habit_text = Helper.data.get(position)[2]; - String detail_text = detail.getText().toString(); - String formattedDate = df.format(c); - try { - - } catch (SQLiteException e) { - } - Log.d("checkingz",""+habit.getText().toString()); - db.update_habitsdata(position, formattedDate,habit_text - , detail.getText().toString().replace("'","''"), catagoryselected); - db.show_data(); - Helper.SelectedButtonOfTodayTab = 1; - Intent intent = new Intent(con, MainActivity.class); - con.startActivity(intent); - ((Activity) con).overridePendingTransition(0, 0); - bottomSheetDialog.dismiss(); - } - - }); - spinner.setAdapter((SpinnerAdapter) adapter); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); - } - }); + } diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedLogAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedLogAdapter.java index de34874c..294ee0de 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedLogAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/AvoidedLogAdapter.java @@ -1,25 +1,25 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; +import android.app.AlarmManager; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.TimePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.database.sqlite.SQLiteException; +import android.os.Build; +import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -30,12 +30,13 @@ import java.util.Date; import java.util.Locale; +import rocks.poopjournal.todont.Alarm; import rocks.poopjournal.todont.Db_Controller; -import rocks.poopjournal.todont.Fragments.AvoidedFragment; import rocks.poopjournal.todont.Fragments.AvoidedLogFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; +import rocks.poopjournal.todont.NotificationReceiver; import rocks.poopjournal.todont.R; +import rocks.poopjournal.todont.databinding.UpdateLayoutBottomSheetTestBinding; public class AvoidedLogAdapter extends RecyclerView.Adapter { @@ -48,7 +49,7 @@ public class AvoidedLogAdapter extends RecyclerView.Adapter donotTask, ArrayList donotCatagory) { @@ -62,95 +63,397 @@ public AvoidedLogAdapter(Context con, AvoidedLogFragment ft, Db_Controller db, A @NonNull @Override - public AvoidedLogAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.recyclerview_layout, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull AvoidedLogAdapter.RecyclerViewHolder holder, final int position) { - db.show_data(); + public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) { + db.show_avoided_data(); String dTask = donotTask.get(position); - String date = Helper.data.get(position)[1]; + String date = Helper.avoidedData.get(position)[1]; holder.task.setText(dTask); holder.dateoftask.setText(date); holder.times.setText(dTask); holder.task.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, - R.style.BottomSheetDialogTheme); - final View bottomsheetview = LayoutInflater.from(con.getApplicationContext()). - inflate(R.layout.update_layout_bottom_sheet_test, - view.findViewById(R.id.bottomsheetContainer)); - final Spinner spinner = bottomsheetview.findViewById(R.id.updatespinner); - Button saveTaskButton = bottomsheetview.findViewById(R.id.updateTaskButton); - final EditText habit = bottomsheetview.findViewById(R.id.updatehabit); - final EditText detail = bottomsheetview.findViewById(R.id.updatedetail); - TextView txt=bottomsheetview.findViewById(R.id.txt); - if (Helper.labels_array.size() == 0) { - txt.setVisibility(View.VISIBLE); - spinner.setVisibility(View.INVISIBLE); + final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, R.style.BottomSheetDialogTheme); + final UpdateLayoutBottomSheetTestBinding bottomsheetview = UpdateLayoutBottomSheetTestBinding.inflate(LayoutInflater.from(con)); + +// if (Helper.labels_array.size() == 0) { +// txt.setVisibility(View.VISIBLE); +// } else { +// txt.setVisibility(View.INVISIBLE); +// } + + bottomsheetview.titleText.setText(dTask); + bottomsheetview.details.setText(Helper.habitsdata.get(position)[3]); + bottomSheetDialog.setContentView(bottomsheetview.getRoot()); + bottomSheetDialog.show(); + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); } else { - txt.setVisibility(View.INVISIBLE); - spinner.setVisibility(View.VISIBLE); + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); } - habit.setText("" + Helper.data.get(position)[2]); - detail.setText("" + Helper.data.get(position)[3]); - final Adapter adapter = new ArrayAdapter(con, android.R.layout.simple_list_item_1, - Helper.labels_array) { - @Override - public boolean isEnabled(int position) { - return position != 0; - } - }; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + bottomsheetview.avoidedPlusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - catagoryselected = adapterView.getItemAtPosition(i).toString(); - TextView selectedText = (TextView) adapterView.getChildAt(i); - if (selectedText != null) { - selectedText.setTextColor(ContextCompat.getColor(con,R.color.g2)); + public void onClick(View view) { + db.show_avoided_data(); + db.show_habits_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided out", Toast.LENGTH_SHORT).show(); } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); } + }); + bottomsheetview.avoidedMinusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onNothingSelected(AdapterView adapterView) { + public void onClick(View view) { + + db.show_avoided_data(); + db.show_avoided_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if ((count + countAll) >= 0 && count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else if ((count + countAll) >= 0) { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); } }); + bottomsheetview.donePlusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.show_done_data(); + db.show_avoided_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done out", Toast.LENGTH_SHORT).show(); + } + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); + + } + + }); + bottomsheetview.doneMinusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.show_done_data(); + db.show_avoided_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if ((count + countAll) >= 0) { + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } + } - saveTaskButton.setOnClickListener(new View.OnClickListener() { + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); + } + }); + bottomsheetview.tvNotification.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - String habit_text = Helper.data.get(position)[2]; - String detail_text = detail.getText().toString(); - String formattedDate = df.format(c); - try { - } catch (SQLiteException e) { + // check if the user has the permission to post notificaiton + // else ask for the permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + NotificationManager notificationManager = ( NotificationManager) con.getSystemService(Context.NOTIFICATION_SERVICE); + if (!notificationManager.areNotificationsEnabled()) { + // Request notification permission + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, con.getPackageName()); + con.startActivity(intent); + }else{ + showDialog(); + } + }else{ + showDialog(); } - Log.d("checkingz",""+habit.getText().toString()); - db.update_data(position, formattedDate, habit.getText().toString(), detail.getText().toString() , Integer.parseInt( Helper.data.get(position)[4]), catagoryselected); - db.show_data(); - Helper.SelectedButtonOfTodayTab = 1; - Intent intent = new Intent(con, MainActivity.class); - con.startActivity(intent); - ((Activity) con).overridePendingTransition(0, 0); - bottomSheetDialog.dismiss(); } + private void showDialog(){ + // Get current time + final Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + + // Create and show TimePickerDialog + TimePickerDialog timePickerDialog = new TimePickerDialog( + view.getContext(), + new TimePickerDialog.OnTimeSetListener() { + + @Override + public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { + // Update the calendar with the selected time + calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + calendar.set(Calendar.MINUTE, minute); + + // After selecting time, show dialog for repetition frequency + showFrequencyDialog(calendar, hourOfDay, minute); + } + }, + hour, + minute, + true // Use 24-hour format + ); + timePickerDialog.show(); + } + + private void showFrequencyDialog(Calendar calendar, int hourOfDay, int minute) { + // Options for repetition frequency + final String[] frequencies = {"Once", "Daily", "Weekly"}; + + // Show an AlertDialog to select frequency + AlertDialog.Builder builder = new AlertDialog.Builder(con); + builder.setTitle("Select Repetition Frequency"); + builder.setItems(frequencies, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String frequency = frequencies[which]; + + // Update tvNotification with selected time and frequency + String notificationText = String.format("Time: %02d:%02d, Frequency: %s", hourOfDay, minute, frequency); + bottomsheetview.tvNotification.setText(notificationText); + + // Schedule notification based on selected time and frequency + scheduleNotification(Integer.parseInt(Helper.habitsdata.get(position)[0]), calendar, frequency); + } + }); + builder.show(); + } + + private void scheduleNotification(int taskId, Calendar calendar, String frequency) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent(context, NotificationReceiver.class); + intent.putExtra("task_id", taskId); // Pass task ID in intent + intent.putExtra("task",Helper.habitsdata.get(position)[2]); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_IMMUTABLE); + + long triggerTime = calendar.getTimeInMillis(); + long interval = 0; + + // Determine repetition interval based on frequency + if (frequency.equals("Daily")) { + interval = AlarmManager.INTERVAL_DAY; + } else if (frequency.equals("Weekly")) { + interval = AlarmManager.INTERVAL_DAY * 7; + } + + // Store alarm details in database + db.insertOrUpdateAlarm(new Alarm(taskId, triggerTime, frequency)); + + // Set the alarm + if (interval > 0) { + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); // For "Once" frequency + } + + Toast.makeText(context, "Notification scheduled: " + frequency, Toast.LENGTH_SHORT).show(); + } + + private void deleteAlarm(int taskId) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + // Cancel alarm with taskId + Intent intent = new Intent(context, NotificationReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_UPDATE_CURRENT); + alarmManager.cancel(pendingIntent); + + // Remove alarm from the database + db.deleteAlarm(taskId); + + Toast.makeText(context, "Notification cancelled", Toast.LENGTH_SHORT).show(); + } + + private void updateAlarm(int taskId, Calendar newCalendar, String newFrequency) { + // First, cancel the existing alarm + deleteAlarm(taskId); + + // Then, set a new alarm with updated time and frequency + scheduleNotification(taskId, newCalendar, newFrequency); + } }); - spinner.setAdapter((SpinnerAdapter) adapter); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); + } }); } + private int getCount(int position) { + int count = Integer.parseInt(getAvoidedCount(Helper.habitsdata.get(position)[2])) - Integer.parseInt(getDoneCount(Helper.habitsdata.get(position)[2])); + db.update_habitsdata(Integer.parseInt(Helper.habitsdata.get(position)[0]), + Helper.habitsdata.get(position)[1], + Helper.habitsdata.get(position)[2], + Helper.habitsdata.get(position)[3], + count, + Helper.habitsdata.get(position)[5]); + return count; + } + + private String getDoneCount(String s) { + for (String x[] : Helper.donedata) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + } + + private String getAvoidedCount(String s) { + for (String x[] : Helper.avoidedData) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + + } + @Override public int getItemCount() { return donotTask.size(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneAdapter.java index 4b0847ef..118336cc 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneAdapter.java @@ -1,28 +1,15 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.database.sqlite.SQLiteException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.bottomsheet.BottomSheetDialog; - import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -32,7 +19,6 @@ import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Fragments.DoneFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; import rocks.poopjournal.todont.R; @@ -45,7 +31,9 @@ public class DoneAdapter extends RecyclerView.Adapter donotTask, ArrayList donotCatagory) { @@ -59,14 +47,14 @@ public DoneAdapter(Context con, DoneFragment ft, Db_Controller db, ArrayList reformed_labels = new ArrayList<>(); - for (int i=0;i(con, android.R.layout.simple_list_item_1, - reformed_labels) { - @Override - public boolean isEnabled(int position) { - return position != 0; - } - - }; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - catagoryselected = adapterView.getItemAtPosition(i).toString().replace("'","''"); - TextView selectedText = (TextView) adapterView.getChildAt(i); - if (selectedText != null) { - selectedText.setTextColor(ContextCompat.getColor(con,R.color.g2)); - } - } - - @Override - public void onNothingSelected(AdapterView adapterView) { - - } - }); - saveTaskButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - String habit_text = Helper.donedata.get(position)[2]; - String detail_text = detail.getText().toString(); - String formattedDate = df.format(c); - try { - - } catch (SQLiteException e) { - } - db.update_habitsdata(position, formattedDate,habit_text - , detail.getText().toString().replace("'","''"), catagoryselected); - db.show_data(); - Intent intent = new Intent(con, MainActivity.class); - con.startActivity(intent); - ((Activity)con).overridePendingTransition(0,0); - bottomSheetDialog.dismiss(); - } - }); - spinner.setAdapter((SpinnerAdapter) adapter); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); - } - }); //ft.setDataInList(); } diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneLogAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneLogAdapter.java index bc721552..62132935 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneLogAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/DoneLogAdapter.java @@ -1,24 +1,25 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; +import android.app.AlarmManager; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.TimePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.database.sqlite.SQLiteException; +import android.os.Build; +import android.provider.Settings; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -29,12 +30,13 @@ import java.util.Date; import java.util.Locale; +import rocks.poopjournal.todont.Alarm; import rocks.poopjournal.todont.Db_Controller; -import rocks.poopjournal.todont.Fragments.DoneFragment; import rocks.poopjournal.todont.Fragments.DoneLogFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; +import rocks.poopjournal.todont.NotificationReceiver; import rocks.poopjournal.todont.R; +import rocks.poopjournal.todont.databinding.UpdateLayoutBottomSheetTestBinding; public class DoneLogAdapter extends RecyclerView.Adapter { @@ -46,7 +48,7 @@ public class DoneLogAdapter extends RecyclerView.Adapter donotTask, ArrayList donotCatagory) { @@ -60,14 +62,14 @@ public DoneLogAdapter(Context con, DoneLogFragment ft, Db_Controller db, ArrayLi @NonNull @Override - public DoneLogAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.recyclerview_layout, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull DoneLogAdapter.RecyclerViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) { db.show_done_data(); String dTask=donotTask.get(position); String date= Helper.donedata.get(position)[1]; @@ -76,74 +78,378 @@ public void onBindViewHolder(@NonNull DoneLogAdapter.RecyclerViewHolder holder, holder.task.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, - R.style.BottomSheetDialogTheme); - final View bottomsheetview = LayoutInflater.from(con.getApplicationContext()). - inflate(R.layout.update_layout_bottom_sheet_test, - view.findViewById(R.id.bottomsheetContainer)); - final Spinner spinner = bottomsheetview.findViewById(R.id.updatespinner); - Button saveTaskButton = bottomsheetview.findViewById(R.id.updateTaskButton); - final EditText habit = bottomsheetview.findViewById(R.id.updatehabit); - final EditText detail = bottomsheetview.findViewById(R.id.updatedetail); - TextView txt=bottomsheetview.findViewById(R.id.txt); - if (Helper.labels_array.size() == 0) { - txt.setVisibility(View.VISIBLE); - spinner.setVisibility(View.INVISIBLE); + final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, R.style.BottomSheetDialogTheme); + final UpdateLayoutBottomSheetTestBinding bottomsheetview = UpdateLayoutBottomSheetTestBinding.inflate(LayoutInflater.from(con)); + +// if (Helper.labels_array.size() == 0) { +// txt.setVisibility(View.VISIBLE); +// } else { +// txt.setVisibility(View.INVISIBLE); +// } + + bottomsheetview.titleText.setText(dTask); + bottomsheetview.details.setText(Helper.habitsdata.get(position)[3]); + bottomSheetDialog.setContentView(bottomsheetview.getRoot()); + bottomSheetDialog.show(); + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); } else { - txt.setVisibility(View.INVISIBLE); - spinner.setVisibility(View.VISIBLE); + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } - habit.setText("" + Helper.donedata.get(position)[2]); - detail.setText("" + Helper.donedata.get(position)[3]); - final Adapter adapter = new ArrayAdapter(con, android.R.layout.simple_list_item_1, - Helper.labels_array) { + bottomsheetview.avoidedPlusButton.setOnClickListener(new View.OnClickListener() { @Override - public boolean isEnabled(int position) { - return position != 0; + public void onClick(View view) { + db.show_avoided_data(); + db.show_habits_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided out", Toast.LENGTH_SHORT).show(); + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); } + }); + + bottomsheetview.avoidedMinusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + db.show_avoided_data(); + db.show_habits_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if ((count + countAll) >= 0 && count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else if ((count + countAll) >= 0) { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } - }; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); + } + }); + bottomsheetview.donePlusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - catagoryselected = adapterView.getItemAtPosition(i).toString(); - TextView selectedText = (TextView) adapterView.getChildAt(i); - if (selectedText != null) { - selectedText.setTextColor(ContextCompat.getColor(con,R.color.g2)); + public void onClick(View view) { + db.show_done_data(); + db.show_habits_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done out", Toast.LENGTH_SHORT).show(); } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); + } + }); + bottomsheetview.doneMinusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onNothingSelected(AdapterView adapterView) { + public void onClick(View view) { + db.show_done_data(); + db.show_habits_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if ((count + countAll) >= 0) { + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } + } + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); } }); - saveTaskButton.setOnClickListener(new View.OnClickListener() { + bottomsheetview.tvNotification.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - String habit_text = Helper.donedata.get(position)[2]; - String detail_text = detail.getText().toString(); - String formattedDate = df.format(c); - try { - } catch (SQLiteException e) { + // check if the user has the permission to post notificaiton + // else ask for the permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + NotificationManager notificationManager = ( NotificationManager) con.getSystemService(Context.NOTIFICATION_SERVICE); + if (!notificationManager.areNotificationsEnabled()) { + // Request notification permission + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, con.getPackageName()); + con.startActivity(intent); + }else{ + showDialog(); + } + }else{ + showDialog(); } - db.update_done_data(position,formattedDate, habit_text, detail_text,Integer.parseInt( Helper.donedata.get(position)[4]), catagoryselected); - db.show_data(); - Intent intent = new Intent(con, MainActivity.class); - con.startActivity(intent); - ((Activity)con).overridePendingTransition(0,0); - bottomSheetDialog.dismiss(); } + private void showDialog(){ + // Get current time + final Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + + // Create and show TimePickerDialog + TimePickerDialog timePickerDialog = new TimePickerDialog( + view.getContext(), + new TimePickerDialog.OnTimeSetListener() { + + @Override + public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { + // Update the calendar with the selected time + calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + calendar.set(Calendar.MINUTE, minute); + + // After selecting time, show dialog for repetition frequency + showFrequencyDialog(calendar, hourOfDay, minute); + } + }, + hour, + minute, + true // Use 24-hour format + ); + timePickerDialog.show(); + } + + private void showFrequencyDialog(Calendar calendar, int hourOfDay, int minute) { + // Options for repetition frequency + final String[] frequencies = {"Once", "Daily", "Weekly"}; + + // Show an AlertDialog to select frequency + AlertDialog.Builder builder = new AlertDialog.Builder(con); + builder.setTitle("Select Repetition Frequency"); + builder.setItems(frequencies, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String frequency = frequencies[which]; + + // Update tvNotification with selected time and frequency + String notificationText = String.format("Time: %02d:%02d, Frequency: %s", hourOfDay, minute, frequency); + bottomsheetview.tvNotification.setText(notificationText); + + // Schedule notification based on selected time and frequency + scheduleNotification(Integer.parseInt(Helper.habitsdata.get(position)[0]), calendar, frequency); + } + }); + builder.show(); + } + + private void scheduleNotification(int taskId, Calendar calendar, String frequency) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent(context, NotificationReceiver.class); + intent.putExtra("task_id", taskId); // Pass task ID in intent + intent.putExtra("task",Helper.habitsdata.get(position)[2]); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_IMMUTABLE); + + long triggerTime = calendar.getTimeInMillis(); + long interval = 0; + + // Determine repetition interval based on frequency + if (frequency.equals("Daily")) { + interval = AlarmManager.INTERVAL_DAY; + } else if (frequency.equals("Weekly")) { + interval = AlarmManager.INTERVAL_DAY * 7; + } + + // Store alarm details in database + db.insertOrUpdateAlarm(new Alarm(taskId, triggerTime, frequency)); + + // Set the alarm + if (interval > 0) { + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); // For "Once" frequency + } + + Toast.makeText(context, "Notification scheduled: " + frequency, Toast.LENGTH_SHORT).show(); + } + + private void deleteAlarm(int taskId) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + // Cancel alarm with taskId + Intent intent = new Intent(context, NotificationReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_UPDATE_CURRENT); + alarmManager.cancel(pendingIntent); + + // Remove alarm from the database + db.deleteAlarm(taskId); + + Toast.makeText(context, "Notification cancelled", Toast.LENGTH_SHORT).show(); + } + + private void updateAlarm(int taskId, Calendar newCalendar, String newFrequency) { + // First, cancel the existing alarm + deleteAlarm(taskId); + + // Then, set a new alarm with updated time and frequency + scheduleNotification(taskId, newCalendar, newFrequency); + } }); - spinner.setAdapter((SpinnerAdapter) adapter); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); + } }); //ft.setDataInList(); + } + private int getCount(int position) { + int count = Integer.parseInt(getAvoidedCount(Helper.habitsdata.get(position)[2])) - Integer.parseInt(getDoneCount(Helper.habitsdata.get(position)[2])); + db.update_habitsdata(Integer.parseInt(Helper.habitsdata.get(position)[0]), + Helper.habitsdata.get(position)[1], + Helper.habitsdata.get(position)[2], + Helper.habitsdata.get(position)[3], + count, + Helper.habitsdata.get(position)[5]); + return count; + } + + private String getDoneCount(String s) { + for (String x[] : Helper.donedata) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + } + + private String getAvoidedCount(String s) { + for (String x[] : Helper.avoidedData) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + } @Override diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsAdapter.java index b9bea9b6..8be336ba 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsAdapter.java @@ -1,25 +1,26 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; +import android.app.AlarmManager; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.TimePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.database.sqlite.SQLiteException; +import android.os.Build; +import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; +import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.TimePicker; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -30,11 +31,19 @@ import java.util.Date; import java.util.Locale; +import rocks.poopjournal.todont.Alarm; import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Fragments.HabitsFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; +import rocks.poopjournal.todont.NotificationReceiver; import rocks.poopjournal.todont.R; +import rocks.poopjournal.todont.databinding.UpdateLayoutBottomSheetTestBinding; +import rocks.poopjournal.todont.utils.SharedPrefUtils; +import smartdevelop.ir.eram.showcaseviewlib.GuideView; +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType; +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity; +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType; +import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener; public class HabitsAdapter extends RecyclerView.Adapter { @@ -42,6 +51,9 @@ public class HabitsAdapter extends RecyclerView.Adapter donotCatagory = new ArrayList<>(); HabitsFragment ft; Context con; + + private SharedPrefUtils prefUtils; + Date c = Calendar.getInstance().getTime(); String[] catagories; String catagoryselected; @@ -55,115 +67,407 @@ public HabitsAdapter(Context con, HabitsFragment ft, Db_Controller db, ArrayList this.con = con; this.ft = ft; this.db = db; - + prefUtils = new SharedPrefUtils(con); } @NonNull @Override - public HabitsAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.recyclerview_layout_habits, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull final HabitsAdapter.RecyclerViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final RecyclerViewHolder holder, final int position) { String dTask = donotTask.get(position); // String dCatagory = donotCatagory.get(position).replace("''", "'"); - String dCatagory = donotCatagory.get(position).replace("''", "'"); + String dCatagory = Helper.habitsdata.get(position)[5]; holder.task.setText(dTask); holder.catagoryoftask.setText(dCatagory); + db.show_avoided_data(); + db.show_done_data(); + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + holder.task.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, R.style.BottomSheetDialogTheme); - final View bottomsheetview = LayoutInflater.from(con.getApplicationContext()).inflate(R.layout.update_layout_bottom_sheet_test, view.findViewById(R.id.bottomsheetContainer)); - final Spinner spinner = bottomsheetview.findViewById(R.id.updatespinner); - Button saveTaskButton = bottomsheetview.findViewById(R.id.updateTaskButton); - final EditText habit = bottomsheetview.findViewById(R.id.updatehabit); - final EditText detail = bottomsheetview.findViewById(R.id.updatedetail); - TextView txt = bottomsheetview.findViewById(R.id.txt); - if (Helper.labels_array.size() == 0) { - txt.setVisibility(View.VISIBLE); - spinner.setVisibility(View.INVISIBLE); + final UpdateLayoutBottomSheetTestBinding bottomsheetview = UpdateLayoutBottomSheetTestBinding.inflate(LayoutInflater.from(con)); + +// if (Helper.labels_array.size() == 0) { +// txt.setVisibility(View.VISIBLE); +// } else { +// txt.setVisibility(View.INVISIBLE); +// } + + bottomsheetview.titleText.setText(dTask); + bottomsheetview.details.setText(Helper.habitsdata.get(position)[3]); + bottomsheetview.tvTag.setText(Helper.habitsdata.get(position)[5]); + bottomSheetDialog.setContentView(bottomsheetview.getRoot()); + bottomSheetDialog.show(); + db.show_done_data(); + db.show_avoided_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); } else { - txt.setVisibility(View.INVISIBLE); - spinner.setVisibility(View.VISIBLE); + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); } - habit.setText("" + Helper.habitsdata.get(position)[2]); - detail.setText("" + Helper.habitsdata.get(position)[3].replace("''", "'")); - - ArrayList reformed_labels = new ArrayList<>(); - for (int i = 0; i < Helper.labels_array.size(); i++) { - reformed_labels.add(Helper.labels_array.get(i).toString().replace("''", "'")); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } - - final Adapter adapter = new ArrayAdapter(con, android.R.layout.simple_list_item_1, reformed_labels) { + bottomsheetview.avoidedPlusButton.setOnClickListener(new View.OnClickListener() { @Override - public boolean isEnabled(int position) { - return position != 0; + public void onClick(View view) { + db.show_done_data(); + db.show_avoided_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided out", Toast.LENGTH_SHORT).show(); + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } + }); - }; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + bottomsheetview.avoidedMinusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onItemSelected(AdapterView adapterView, View view, int i, long l) { - catagoryselected = adapterView.getItemAtPosition(i).toString().replace("'", "''"); - TextView selectedText = (TextView) adapterView.getChildAt(i); - if (selectedText != null) { - selectedText.setTextColor(ContextCompat.getColor(con, R.color.g2)); + public void onClick(View view) { + + db.show_avoided_data(); + db.show_habits_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.avoidedData.get(position)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(position)[4]); + } + } + if ((count + countAll) >= 0 && count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else if ((count + countAll) >= 0) { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + }); + bottomsheetview.donePlusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.show_done_data(); + db.show_habits_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.donedata.get(position)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done out", Toast.LENGTH_SHORT).show(); } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } + }); + bottomsheetview.doneMinusButton.setOnClickListener(new View.OnClickListener() { @Override - public void onNothingSelected(AdapterView adapterView) { + public void onClick(View view) { + db.show_done_data(); + db.show_habits_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.donedata.get(position)[4]); + } + } + if ((count + countAll) >= 0) { + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } + } + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } }); - saveTaskButton.setOnClickListener(new View.OnClickListener() { + bottomsheetview.tvNotification.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - String formattedDate = df.format(c); - try { - } catch (SQLiteException e) { + // check if the user has the permission to post notificaiton + // else ask for the permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + NotificationManager notificationManager = ( NotificationManager) con.getSystemService(Context.NOTIFICATION_SERVICE); + if (!notificationManager.areNotificationsEnabled()) { + // Request notification permission + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, con.getPackageName()); + con.startActivity(intent); + }else{ + showDialog(); + } + }else{ + showDialog(); } - String str = habit.getText().toString(); - if (str.contains("'")) { - str = str.replace("'", "geodhola"); - Log.d("kuttistring", "" + str); + } + + private void showDialog(){ + // Get current time + final Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + + // Create and show TimePickerDialog + TimePickerDialog timePickerDialog = new TimePickerDialog( + view.getContext(), + new TimePickerDialog.OnTimeSetListener() { + + @Override + public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { + // Update the calendar with the selected time + calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + calendar.set(Calendar.MINUTE, minute); + + // After selecting time, show dialog for repetition frequency + showFrequencyDialog(calendar, hourOfDay, minute); + } + }, + hour, + minute, + true // Use 24-hour format + ); + timePickerDialog.show(); + } + + private void showFrequencyDialog(Calendar calendar, int hourOfDay, int minute) { + // Options for repetition frequency + final String[] frequencies = {"Once", "Daily", "Weekly"}; + + // Show an AlertDialog to select frequency + AlertDialog.Builder builder = new AlertDialog.Builder(con); + builder.setTitle("Select Repetition Frequency"); + builder.setItems(frequencies, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String frequency = frequencies[which]; + + // Update tvNotification with selected time and frequency + String notificationText = String.format("Time: %02d:%02d, Frequency: %s", hourOfDay, minute, frequency); + bottomsheetview.tvNotification.setText(notificationText); + + // Schedule notification based on selected time and frequency + scheduleNotification(Integer.parseInt(Helper.habitsdata.get(position)[0]), calendar, frequency); + } + }); + builder.show(); + } + + private void scheduleNotification(int taskId, Calendar calendar, String frequency) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent(context, NotificationReceiver.class); + intent.putExtra("task_id", taskId); // Pass task ID in intent + intent.putExtra("task",Helper.habitsdata.get(position)[2]); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_IMMUTABLE); + + long triggerTime = calendar.getTimeInMillis(); + long interval = 0; + + // Determine repetition interval based on frequency + if (frequency.equals("Daily")) { + interval = AlarmManager.INTERVAL_DAY; + } else if (frequency.equals("Weekly")) { + interval = AlarmManager.INTERVAL_DAY * 7; } - db.update_habitsdata(position, formattedDate, str, detail.getText().toString().replace("'", "''"), catagoryselected); - db.show_habits_data(); - Intent intent = new Intent(con, MainActivity.class); - con.startActivity(intent); - ((Activity) con).overridePendingTransition(0, 0); - bottomSheetDialog.dismiss(); + + // Store alarm details in database + db.insertOrUpdateAlarm(new Alarm(taskId, triggerTime, frequency)); + + // Set the alarm + if (interval > 0) { + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); // For "Once" frequency + } + + Toast.makeText(context, "Notification scheduled: " + frequency, Toast.LENGTH_SHORT).show(); } - }); + private void deleteAlarm(int taskId) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - spinner.setAdapter((SpinnerAdapter) adapter); - spinner.setSelection(reformed_labels.indexOf(dCatagory)); + // Cancel alarm with taskId + Intent intent = new Intent(context, NotificationReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_UPDATE_CURRENT); + alarmManager.cancel(pendingIntent); + + // Remove alarm from the database + db.deleteAlarm(taskId); + + Toast.makeText(context, "Notification cancelled", Toast.LENGTH_SHORT).show(); + } + + private void updateAlarm(int taskId, Calendar newCalendar, String newFrequency) { + // First, cancel the existing alarm + deleteAlarm(taskId); + + // Then, set a new alarm with updated time and frequency + scheduleNotification(taskId, newCalendar, newFrequency); + } + }); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); } }); + + holder.btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (Helper.isTodaySelected == true) { - db.show_data(); - db.show_habits_data(); - Log.d("asize", "" + Helper.data.size()); + if (!prefUtils.getBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED)) { + GuideView.Builder guideView = new GuideView.Builder(con) + .setContentText("Mark as done or avoided.") + .setTargetView(holder.viewDoneOrAvoided) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED, true); + } + }); + guideView.build().show(); + } else if (Helper.isTodaySelected == true) { + db.show_done_data(); + db.show_avoided_data(); + Log.d("asize", "" + Helper.avoidedData.size()); int count = 0; int countAll = 0; - int ids = 0; - if (Helper.data.size() != 0) { - for (int i = 0; i < Helper.data.size(); i++) { - String getdate = Helper.data.get(i)[1]; - String gethabit = Helper.data.get(i)[2]; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { // Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); count++; @@ -173,9 +477,8 @@ public void onClick(View view) { if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { // Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); count++; - ids = i; - countAll = Integer.parseInt(Helper.data.get(position)[4]); - Log.i("tariq", "onClick: " + Helper.data.get(position)[4]); + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); } } if (count == 0) { @@ -188,22 +491,42 @@ public void onClick(View view) { Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); } } else { - int res = count + countAll; + int res = 1; db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); Toast.makeText(con, " Added To Avoided out", Toast.LENGTH_SHORT).show(); } + + db.show_done_data(); + db.show_avoided_data(); + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } } }); holder.btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (Helper.isTodaySelected == true) { + if (!prefUtils.getBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED)) { + GuideView.Builder guideView = new GuideView.Builder(con) + .setContentText("Mark as done or avoided.") + .setTargetView(holder.viewDoneOrAvoided) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED, true); + } + }); + guideView.build().show(); + } else if (Helper.isTodaySelected == true) { db.show_done_data(); - db.show_habits_data(); + db.show_avoided_data(); + int count = 0; int countAll = 0; - int ids = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); if (Helper.donedata.size() != 0) { for (int i = 0; i < Helper.donedata.size(); i++) { String getdate = Helper.donedata.get(i)[1]; @@ -211,8 +534,7 @@ public void onClick(View view) { if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { // Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); count++; - ids = i; - countAll = Integer.parseInt(Helper.donedata.get(position)[4]); + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); } } if (count == 0) { @@ -225,15 +547,39 @@ public void onClick(View view) { Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); } } else { - int res = count + countAll; + int res = 1; db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); Toast.makeText(con, "Added To Done out", Toast.LENGTH_SHORT).show(); } + db.show_done_data(); + db.show_avoided_data(); + + holder.tvAvoided.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + holder.tvDone.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } } }); } + private String getDoneCount(String s) { + for (String x[] : Helper.donedata) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + } + + private String getAvoidedCount(String s) { + for (String x[] : Helper.avoidedData) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + + } + @Override public int getItemCount() { return donotTask.size(); @@ -242,7 +588,8 @@ public int getItemCount() { public class RecyclerViewHolder extends RecyclerView.ViewHolder { Button btn1, btn2; TextView task; - TextView catagoryoftask; + TextView catagoryoftask, tvAvoided, tvDone; + LinearLayout viewDoneOrAvoided; public RecyclerViewHolder(@NonNull View itemView) { super(itemView); @@ -252,6 +599,9 @@ public RecyclerViewHolder(@NonNull View itemView) { catagoryoftask = itemView.findViewById(R.id.catagoryoftask); btn1.setBackgroundResource(R.drawable._cross); btn2.setBackgroundResource(R.drawable._tick); + viewDoneOrAvoided = itemView.findViewById(R.id.viewDoneOrAvoided); + tvAvoided = itemView.findViewById(R.id.tvAvoided); + tvDone = itemView.findViewById(R.id.tvDone); } } } diff --git a/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsLogAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsLogAdapter.java index ec715ad1..7256f5ee 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsLogAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Adapters/HabitsLogAdapter.java @@ -1,25 +1,25 @@ package rocks.poopjournal.todont.Adapters; -import android.app.Activity; +import android.app.AlarmManager; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.TimePickerDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.database.sqlite.SQLiteException; +import android.os.Build; +import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -30,11 +30,13 @@ import java.util.Date; import java.util.Locale; +import rocks.poopjournal.todont.Alarm; import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Fragments.HabitsLogFragment; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; +import rocks.poopjournal.todont.NotificationReceiver; import rocks.poopjournal.todont.R; +import rocks.poopjournal.todont.databinding.UpdateLayoutBottomSheetTestBinding; public class HabitsLogAdapter extends RecyclerView.Adapter { @@ -46,7 +48,7 @@ public class HabitsLogAdapter extends RecyclerView.Adapter donotTask, ArrayList donotCatagory) { @@ -60,91 +62,397 @@ public HabitsLogAdapter(Context con, HabitsLogFragment ft, Db_Controller db, Arr @NonNull @Override - public HabitsLogAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.recyclerview_layout_log_habits, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull final HabitsLogAdapter.RecyclerViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final RecyclerViewHolder holder, final int position) { String dTask = donotTask.get(position); - String dCatagory = donotCatagory.get(position); + String dCatagory = Helper.habitsdata.get(position)[5]; Log.d("dCat",""+dCatagory); holder.task.setText(dTask); - holder.catagoryoftask.setText(dCatagory); + holder.catagoryoftask.setText(Helper.habitsdata.get(position)[5]); holder.task.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, - R.style.BottomSheetDialogTheme); - final View bottomsheetview = LayoutInflater.from(con.getApplicationContext()). - inflate(R.layout.update_layout_bottom_sheet_test, - view.findViewById(R.id.bottomsheetContainer)); - /* final Spinner spinner = bottomsheetview.findViewById(R.id.updatespinner); - Button saveTaskButton = bottomsheetview.findViewById(R.id.updateTaskButton); - final EditText habit = bottomsheetview.findViewById(R.id.updatehabit); - final EditText detail = bottomsheetview.findViewById(R.id.updatedetail); - TextView txt = bottomsheetview.findViewById(R.id.txt); - if (Helper.labels_array.size() == 0) { - txt.setVisibility(View.VISIBLE); - spinner.setVisibility(View.INVISIBLE); + final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(con, R.style.BottomSheetDialogTheme); + final UpdateLayoutBottomSheetTestBinding bottomsheetview = UpdateLayoutBottomSheetTestBinding.inflate(LayoutInflater.from(con)); + +// if (Helper.labels_array.size() == 0) { +// txt.setVisibility(View.VISIBLE); +// } else { +// txt.setVisibility(View.INVISIBLE); +// } + + bottomsheetview.titleText.setText(dTask); + bottomsheetview.tvTag.setText(Helper.habitsdata.get(position)[5]); + bottomsheetview.details.setText(Helper.habitsdata.get(position)[3]); + bottomSheetDialog.setContentView(bottomsheetview.getRoot()); + bottomSheetDialog.show(); + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); } else { - txt.setVisibility(View.INVISIBLE); - spinner.setVisibility(View.VISIBLE); + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); } - habit.setText("" + Helper.habitsdata.get(position)[2]); - detail.setText("" + Helper.habitsdata.get(position)[3]);*/ - final Adapter adapter = new ArrayAdapter(con, android.R.layout.simple_list_item_1, - Helper.labels_array) { + bottomsheetview.avoidedPlusButton.setOnClickListener(new View.OnClickListener() { @Override - public boolean isEnabled(int position) { - return position != 0; + public void onClick(View view) { + db.show_avoided_data(); + db.show_avoided_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided out", Toast.LENGTH_SHORT).show(); + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); } + }); + + bottomsheetview.avoidedMinusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + db.show_avoided_data(); + db.show_avoided_data(); + Log.d("asize", "" + Helper.avoidedData.size()); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.avoidedData.size() != 0) { + for (int i = 0; i < Helper.avoidedData.size(); i++) { + String getdate = Helper.avoidedData.get(i)[1]; + String gethabit = Helper.avoidedData.get(i)[2]; + /* if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + } + +*/ + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.avoidedData.get(i)[4]); + Log.i("tariq", "onClick: " + Helper.avoidedData.get(i)[4]); + } + } + if ((count + countAll) >= 0 && count == 0) { + int res = count + countAll; + db.insert_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } else if ((count + countAll) >= 0) { + int res = count + countAll; + db.update_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, " Added To Avoided", Toast.LENGTH_SHORT).show(); + } + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.avoidedData.size() == 0) { + bottomsheetview.avoidedCount.setText("0"); + } else { + bottomsheetview.avoidedCount.setText(getAvoidedCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); + } + }); + bottomsheetview.donePlusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.show_done_data(); + db.show_avoided_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count++; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } else { + int res = 1; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done out", Toast.LENGTH_SHORT).show(); + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + //holder.catagoryoftask.setText(String.valueOf(getCount(position))); + + } + + }); + bottomsheetview.doneMinusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.show_done_data(); + db.show_avoided_data(); + int count = 0; + int countAll = 0; + int ids = Integer.parseInt(Helper.habitsdata.get(position)[0]); + if (Helper.donedata.size() != 0) { + for (int i = 0; i < Helper.donedata.size(); i++) { + String getdate = Helper.donedata.get(i)[1]; + String gethabit = Helper.donedata.get(i)[2]; + if ((Helper.habitsdata.get(position)[2].equals(gethabit)) && (getdate.equals(df.format(c)))) { +// Toast.makeText(con, " Already Added ", Toast.LENGTH_SHORT).show(); + count--; + countAll = Integer.parseInt(Helper.donedata.get(i)[4]); + } + } + if ((count + countAll) >= 0) { + if (count == 0) { + int res = count + countAll; + db.insert_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done", Toast.LENGTH_SHORT).show(); + } else { + int res = count + countAll; + db.update_done_data(ids, df.format(c), Helper.habitsdata.get(position)[2], Helper.habitsdata.get(position)[3], res, catagoryselected); + Toast.makeText(con, "Added To Done ", Toast.LENGTH_SHORT).show(); + } + } + } + + db.show_avoided_data(); + db.show_done_data(); + if (Helper.donedata.size() == 0) { + bottomsheetview.doneCount.setText("0"); + } else { + bottomsheetview.doneCount.setText(getDoneCount(Helper.habitsdata.get(position)[2])); + } + // holder.catagoryoftask.setText(String.valueOf(getCount(position))); + } + }); + bottomsheetview.tvNotification.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + // check if the user has the permission to post notificaiton + // else ask for the permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + NotificationManager notificationManager = ( NotificationManager) con.getSystemService(Context.NOTIFICATION_SERVICE); + if (!notificationManager.areNotificationsEnabled()) { + // Request notification permission + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, con.getPackageName()); + con.startActivity(intent); + }else{ + showDialog(); + } + }else{ + showDialog(); + } + } + + private void showDialog(){ + // Get current time + final Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + + // Create and show TimePickerDialog + TimePickerDialog timePickerDialog = new TimePickerDialog( + view.getContext(), + new TimePickerDialog.OnTimeSetListener() { + + @Override + public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { + // Update the calendar with the selected time + calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); + calendar.set(Calendar.MINUTE, minute); + + // After selecting time, show dialog for repetition frequency + showFrequencyDialog(calendar, hourOfDay, minute); + } + }, + hour, + minute, + true // Use 24-hour format + ); + timePickerDialog.show(); + } + + private void showFrequencyDialog(Calendar calendar, int hourOfDay, int minute) { + // Options for repetition frequency + final String[] frequencies = {"Once", "Daily", "Weekly"}; + + // Show an AlertDialog to select frequency + AlertDialog.Builder builder = new AlertDialog.Builder(con); + builder.setTitle("Select Repetition Frequency"); + builder.setItems(frequencies, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String frequency = frequencies[which]; + + // Update tvNotification with selected time and frequency + String notificationText = String.format("Time: %02d:%02d, Frequency: %s", hourOfDay, minute, frequency); + bottomsheetview.tvNotification.setText(notificationText); + + // Schedule notification based on selected time and frequency + scheduleNotification(Integer.parseInt(Helper.habitsdata.get(position)[0]), calendar, frequency); + } + }); + builder.show(); + } + + private void scheduleNotification(int taskId, Calendar calendar, String frequency) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent(context, NotificationReceiver.class); + intent.putExtra("task_id", taskId); // Pass task ID in intent + intent.putExtra("task",Helper.habitsdata.get(position)[2]); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_IMMUTABLE); + + long triggerTime = calendar.getTimeInMillis(); + long interval = 0; + + // Determine repetition interval based on frequency + if (frequency.equals("Daily")) { + interval = AlarmManager.INTERVAL_DAY; + } else if (frequency.equals("Weekly")) { + interval = AlarmManager.INTERVAL_DAY * 7; + } + + // Store alarm details in database + db.insertOrUpdateAlarm(new Alarm(taskId, triggerTime, frequency)); + + // Set the alarm + if (interval > 0) { + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); // For "Once" frequency + } + + Toast.makeText(context, "Notification scheduled: " + frequency, Toast.LENGTH_SHORT).show(); + } + + private void deleteAlarm(int taskId) { + Context context = con; + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + // Cancel alarm with taskId + Intent intent = new Intent(context, NotificationReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, taskId, intent, PendingIntent.FLAG_UPDATE_CURRENT); + alarmManager.cancel(pendingIntent); + + // Remove alarm from the database + db.deleteAlarm(taskId); + + Toast.makeText(context, "Notification cancelled", Toast.LENGTH_SHORT).show(); + } + + private void updateAlarm(int taskId, Calendar newCalendar, String newFrequency) { + // First, cancel the existing alarm + deleteAlarm(taskId); + + // Then, set a new alarm with updated time and frequency + scheduleNotification(taskId, newCalendar, newFrequency); + } + }); - }; -// spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { -// @Override -// public void onItemSelected(AdapterView adapterView, View view, int i, long l) { -// catagoryselected = adapterView.getItemAtPosition(i).toString(); -// TextView selectedText = (TextView) adapterView.getChildAt(i); -// if (selectedText != null) { -// selectedText.setTextColor(ContextCompat.getColor(con, R.color.g2)); -// } -// } -// -// @Override -// public void onNothingSelected(AdapterView adapterView) { -// -// } -// }); -// saveTaskButton.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View view) { -// String formattedDate = df.format(c); -// try { -// -// } catch (SQLiteException e) { -// } -// db.update_habitsdata(position, formattedDate, habit.getText().toString() -// , detail.getText().toString(), catagoryselected); -// db.show_habits_data(); -// Intent intent = new Intent(con, MainActivity.class); -// con.startActivity(intent); -// ((Activity) con).overridePendingTransition(0, 0); -// bottomSheetDialog.dismiss(); -// } -// -// }); - -// spinner.setAdapter((SpinnerAdapter) adapter); - bottomSheetDialog.setContentView(bottomsheetview); - bottomSheetDialog.show(); } }); } + private int getCount(int position) { + int count = Integer.parseInt(getAvoidedCount(Helper.habitsdata.get(position)[2])) - Integer.parseInt(getDoneCount(Helper.habitsdata.get(position)[2])); + db.update_habitsdata(Integer.parseInt(Helper.habitsdata.get(position)[0]), + Helper.habitsdata.get(position)[1], + Helper.habitsdata.get(position)[2], + Helper.habitsdata.get(position)[3], + count, + Helper.habitsdata.get(position)[5]); + return count; + } + + private String getDoneCount(String s) { + for (String x[] : Helper.donedata) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + } + + private String getAvoidedCount(String s) { + for (String x[] : Helper.avoidedData) { + if (x[2].equalsIgnoreCase(s)) { + return x[4]; + } + } + return "0"; + + } + @Override public int getItemCount() { return donotTask.size(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Alarm.java b/app/src/main/java/rocks/poopjournal/todont/Alarm.java new file mode 100644 index 00000000..b66cb79a --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/todont/Alarm.java @@ -0,0 +1,50 @@ +package rocks.poopjournal.todont; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class Alarm { + private int taskId; + private long alarmTime; + private String frequency; + + // Constructor + public Alarm(int taskId, long alarmTime, String frequency) { + this.taskId = taskId; + this.alarmTime = alarmTime; + this.frequency = frequency; + } + + // Getters and setters + public int getTaskId() { + return taskId; + } + + public void setTaskId(int taskId) { + this.taskId = taskId; + } + + public long getAlarmTime() { + return alarmTime; + } + + public void setAlarmTime(long alarmTime) { + this.alarmTime = alarmTime; + } + + public String getFrequency() { + return frequency; + } + + public void setFrequency(String frequency) { + this.frequency = frequency; + } + + // Optional: Convert alarm time to readable format (for display purposes) + public String getFormattedAlarmTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); + return sdf.format(new Date(alarmTime)); + } +} + diff --git a/app/src/main/java/rocks/poopjournal/todont/DatabaseManager.java b/app/src/main/java/rocks/poopjournal/todont/DatabaseManager.java new file mode 100644 index 00000000..070ad085 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/todont/DatabaseManager.java @@ -0,0 +1,73 @@ +package rocks.poopjournal.todont; + +import android.content.Context; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class DatabaseManager { + private Context context; + private static final String DATABASE_NAME = "todont.sqlite"; + private static final String BACKUP_FILE_NAME = "todont.sqlite"; // Name of the backup file + private static final String TAG = "DatabaseManager"; + + public DatabaseManager(Context context) { + this.context = context; + } + + public void deleteCurrentDatabase() { + // Get the path of the current database + File currentDatabase = context.getDatabasePath(DATABASE_NAME); + + // Check if the current database exists + if (currentDatabase.exists()) { + // Delete the existing database + if (currentDatabase.delete()) { + Log.d(TAG, "Existing database deleted successfully."); + } else { + Log.e(TAG, "Failed to delete existing database."); + return; // Exit if unable to delete + } + } + } + + public void restoreDatabase() { + File currentDatabase = context.getDatabasePath(DATABASE_NAME); + deleteCurrentDatabase(); + + // Now proceed to restore the new database from the backup file + File backupFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), DATABASE_NAME); + + if (!backupFile.exists()) { + Log.e(TAG, "Backup file does not exist."); + return; // Exit if backup file is not found + } + + // Copy the backup file to the database location + try { + copyDatabase(backupFile, currentDatabase); + Log.d(TAG, "Database restored successfully."); + } catch (IOException e) { + Log.e(TAG, "Failed to restore database: " + e.getMessage()); + } + } + + private void copyDatabase(File sourceFile, File destFile) throws IOException { + FileInputStream fis = new FileInputStream(sourceFile); + FileOutputStream fos = new FileOutputStream(destFile); + + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); + } + + fos.flush(); + fos.close(); + fis.close(); + } +} \ No newline at end of file diff --git a/app/src/main/java/rocks/poopjournal/todont/DatabaseUtils.java b/app/src/main/java/rocks/poopjournal/todont/DatabaseUtils.java new file mode 100644 index 00000000..6c9461f0 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/todont/DatabaseUtils.java @@ -0,0 +1,92 @@ +package rocks.poopjournal.todont; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.MediaStore; +import android.widget.Toast; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStream; + +public class DatabaseUtils { + + public static void copyDatabaseToDownloads(Context context, String dbName) { + try { + // Get the database file from the app's private directory + File dbFile = context.getDatabasePath(dbName); + + // For Android 10 (API 29) and above, use the MediaStore API to write to Downloads folder + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + saveFileToDownloadsUsingMediaStore(context, dbFile); + } else { + // For Android 9 (API 28) and below, use traditional file writing with WRITE_EXTERNAL_STORAGE permission + File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + File destFile = new File(downloadsDir, dbFile.getName()); + copyFile(dbFile, destFile); + Toast.makeText(context, "Database copied to: " + destFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); + } + + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(context, "Failed to copy database: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + + // Method for copying the file for Android 10 and above using MediaStore API + private static void saveFileToDownloadsUsingMediaStore(Context context, File sourceFile) { + ContentResolver contentResolver = context.getContentResolver(); + ContentValues values = new ContentValues(); + + // Set up the details for the file in MediaStore + values.put(MediaStore.MediaColumns.DISPLAY_NAME, sourceFile.getName()); + values.put(MediaStore.MediaColumns.MIME_TYPE, "application/octet-stream"); + values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); + + // Insert the file details to MediaStore, getting the URI + Uri fileUri = contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values); + + if (fileUri != null) { + try (OutputStream outputStream = contentResolver.openOutputStream(fileUri); + FileInputStream inputStream = new FileInputStream(sourceFile)) { + + // Copy the data from the source file to the destination stream + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + + Toast.makeText(context, "Database copied to Downloads folder", Toast.LENGTH_LONG).show(); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(context, "Failed to save file: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + } + + // Method for copying the file in older Android versions + private static void copyFile(File sourceFile, File destFile) throws Exception { + FileInputStream inputStream = null; + OutputStream outputStream = null; + + try { + inputStream = new FileInputStream(sourceFile); + outputStream = new FileOutputStream(destFile); + + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + } finally { + if (inputStream != null) inputStream.close(); + if (outputStream != null) outputStream.close(); + } + } +} diff --git a/app/src/main/java/rocks/poopjournal/todont/Db_Controller.java b/app/src/main/java/rocks/poopjournal/todont/Db_Controller.java index 2982e37b..3c45b406 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Db_Controller.java +++ b/app/src/main/java/rocks/poopjournal/todont/Db_Controller.java @@ -9,20 +9,31 @@ import android.util.Log; import java.util.ArrayList; +import java.util.List; public class Db_Controller extends SQLiteOpenHelper { + + private static final String TABLE_ALARMS = "alarms"; + private static final String COLUMN_TASK_ID = "task_id"; + private static final String COLUMN_ALARM_TIME = "alarm_time"; + private static final String COLUMN_FREQUENCY = "frequency"; + private static final String CREATE_TABLE_ALARMS = "CREATE TABLE " + TABLE_ALARMS + " (" + + COLUMN_TASK_ID + " INTEGER PRIMARY KEY, " + + COLUMN_ALARM_TIME + " INTEGER, " + // store alarm time as Unix timestamp + COLUMN_FREQUENCY + " TEXT)"; public Db_Controller(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { - super(context, "e.db", factory, version); + super(context, "todont.sqlite", factory, 3); } @Override public void onCreate(SQLiteDatabase db) { //ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - db.execSQL("CREATE TABLE HABITS(ID INTEGER,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); - db.execSQL("CREATE TABLE AVOIDED(ID INTEGER,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); - db.execSQL("CREATE TABLE DONE(ID INTEGER,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); + db.execSQL("CREATE TABLE HABITS(ID INTEGER Primary key ,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); + db.execSQL("CREATE TABLE AVOIDED(ID INTEGER Primary key ,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); + db.execSQL("CREATE TABLE DONE(ID INTEGER Primary key ,DATE TEXT,HABIT TEXT,DETAIL TEXT,TIMES INTEGER,CATAGORY TEXT);"); db.execSQL("CREATE TABLE LABELS(LABEL TEXT);"); db.execSQL("CREATE TABLE CHECKNIGHTMODE(NIGHTMODE TEXT);"); + db.execSQL(CREATE_TABLE_ALARMS); } @Override @@ -32,9 +43,65 @@ public void onUpgrade(SQLiteDatabase db, int i, int i1) { db.execSQL("DROP TABLE IF EXISTS DONE;"); db.execSQL("DROP TABLE IF EXISTS LABELS;"); db.execSQL("DROP TABLE IF EXISTS CHECKNIGHTMODE;"); + db.execSQL("DROP TABLE IF EXISTS "+TABLE_ALARMS+";"); onCreate(db); } + // Insert or Update alarm + public void insertOrUpdateAlarm(Alarm alarm) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(COLUMN_TASK_ID, alarm.getTaskId()); + values.put(COLUMN_ALARM_TIME, alarm.getAlarmTime()); + values.put(COLUMN_FREQUENCY, alarm.getFrequency()); + + db.replace(TABLE_ALARMS, null, values); // Use replace to update if task_id exists + db.close(); + } + // Delete alarm by task ID + public void deleteAlarm(int taskId) { + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(TABLE_ALARMS, COLUMN_TASK_ID + " = ?", new String[]{String.valueOf(taskId)}); + db.close(); + } + // Get alarm details by task ID + public Alarm getAlarm(int taskId) { + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.query(TABLE_ALARMS, null, COLUMN_TASK_ID + " = ?", new String[]{String.valueOf(taskId)}, null, null, null); + + if (cursor != null && cursor.moveToFirst()) { + long alarmTime = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_ALARM_TIME)); + String frequency = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_FREQUENCY)); + cursor.close(); + db.close(); + return new Alarm(taskId, alarmTime, frequency); + } else { + if (cursor != null) cursor.close(); + db.close(); + return null; // Alarm not found + } + } + // Get all alarms + public List getAllAlarms() { + List alarmList = new ArrayList<>(); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.query(TABLE_ALARMS, null, null, null, null, null, null); + + if (cursor != null && cursor.moveToFirst()) { + do { + int taskId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_TASK_ID)); + long alarmTime = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_ALARM_TIME)); + String frequency = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_FREQUENCY)); + alarmList.add(new Alarm(taskId, alarmTime, frequency)); + } while (cursor.moveToNext()); + } + + if (cursor != null) cursor.close(); + db.close(); + return alarmList; + } + + public void insert_label(String label) { Log.d("insert_label...", "" + label); ContentValues con = new ContentValues(); @@ -103,7 +170,7 @@ public void show_habits_data() { Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM HABITS", null); Helper.habitsdata = new ArrayList<>(); while (cursor.moveToNext()) { - String[] temp = new String[5]; + String[] temp = new String[6]; temp[0] = (cursor.getString(0)); temp[1] = (cursor.getString(1)); String str = (cursor.getString(2)); @@ -113,25 +180,26 @@ public void show_habits_data() { temp[2] = str; temp[3] = (cursor.getString(3)); temp[4] = (cursor.getString(4)); + temp[5] = (cursor.getString(5)); Helper.habitsdata.add(temp); } } - public void show_data() { + public void show_avoided_data() { Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM AVOIDED", null); - Helper.data = new ArrayList<>(); + Helper.avoidedData = new ArrayList<>(); while (cursor.moveToNext()) { - String[] temp = new String[5]; + String[] temp = new String[6]; temp[0] = (cursor.getString(0)); temp[1] = (cursor.getString(1)); temp[2] = (cursor.getString(2)); temp[3] = (cursor.getString(3)); temp[4] = (cursor.getString(4)); -// temp[5] = (cursor.getString(5)); + temp[5] = (cursor.getString(5)); - Helper.data.add(temp); + Helper.avoidedData.add(temp); } } @@ -142,13 +210,13 @@ public void show_done_data() { Helper.donedata = new ArrayList<>(); while (cursor.moveToNext()) { - String[] temp = new String[5]; + String[] temp = new String[6]; temp[0] = (cursor.getString(0)); temp[1] = (cursor.getString(1)); temp[2] = (cursor.getString(2)); temp[3] = (cursor.getString(3)); temp[4] = (cursor.getString(4)); -// temp[5] = (cursor.getString(5)); + temp[5] = (cursor.getString(5)); Helper.donedata.add(temp); @@ -164,9 +232,8 @@ public void show_labels() { } } - public void update_habitsdata(int id, String date, String habit, String detail, String catagory) { - - this.getWritableDatabase().execSQL("UPDATE HABITS SET DATE='" + date + "',HABIT='" + habit + "',DETAIL='" + detail + "',CATAGORY='" + catagory + "' WHERE ID='" + id + "'"); + public void update_habitsdata(int id, String date, String habit, String detail,int count, String catagory) { + this.getWritableDatabase().execSQL("UPDATE HABITS SET DATE='" + date + "',HABIT='" + habit + "',DETAIL='" + detail + "',TIMES='" + count + "',CATAGORY='" + catagory + "' WHERE ID='" + id + "'"); } /* public void update_habitsdata(int id, String date, String habit, String detail, int times, String category) { @@ -538,4 +605,5 @@ public int countLabels(String catagory) { cursor.close(); return count; } + } \ No newline at end of file diff --git a/app/src/main/java/rocks/poopjournal/todont/Db_Helper.java b/app/src/main/java/rocks/poopjournal/todont/Db_Helper.java new file mode 100644 index 00000000..e029eb30 --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/todont/Db_Helper.java @@ -0,0 +1,244 @@ +package rocks.poopjournal.todont; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; + +public class Db_Helper extends SQLiteOpenHelper { + private static final String DATABASE_NAME = "todont.sqlite"; + private static final int DATABASE_VERSION = 2; + + // Table names + private static final String TABLE_HABITS = "HABITS"; + private static final String TABLE_AVOIDED = "AVOIDED"; + private static final String TABLE_DONE = "DONE"; + private static final String TABLE_LABELS = "LABELS"; + private static final String TABLE_CHECKNIGHTMODE = "CHECKNIGHTMODE"; + + // Common column names + private static final String KEY_ID = "ID INTEGER PRIMARY KEY AUTOINCREMENT"; // Using AUTOINCREMENT + private static final String KEY_DATE = "DATE TEXT"; + private static final String KEY_HABIT = "HABIT TEXT"; + private static final String KEY_DETAIL = "DETAIL TEXT"; + private static final String KEY_TIMES = "TIMES INTEGER"; + private static final String KEY_CATEGORY = "CATEGORY TEXT"; + + // Table specific columns + private static final String KEY_LABEL = "LABEL TEXT"; + private static final String KEY_NIGHTMODE = "NIGHTMODE TEXT"; + + private SQLiteDatabase database; + private Context context; + + public Db_Helper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + this.context = context; + } + + @Override + public void onCreate(SQLiteDatabase db) { + String CREATE_HABITS_TABLE = "CREATE TABLE " + TABLE_HABITS + "(" + + KEY_ID + ", " + KEY_DATE + ", " + KEY_HABIT + ", " + + KEY_DETAIL + ", " + KEY_TIMES + ", " + KEY_CATEGORY + ");"; + + String CREATE_AVOIDED_TABLE = "CREATE TABLE " + TABLE_AVOIDED + "(" + + KEY_ID + ", " + KEY_DATE + ", " + KEY_HABIT + ", " + + KEY_DETAIL + ", " + KEY_TIMES + ", " + KEY_CATEGORY + ");"; + + String CREATE_DONE_TABLE = "CREATE TABLE " + TABLE_DONE + "(" + + KEY_ID + ", " + KEY_DATE + ", " + KEY_HABIT + ", " + + KEY_DETAIL + ", " + KEY_TIMES + ", " + KEY_CATEGORY + ");"; + + String CREATE_LABELS_TABLE = "CREATE TABLE " + TABLE_LABELS + "(" + KEY_LABEL + ");"; + String CREATE_NIGHTMODE_TABLE = "CREATE TABLE " + TABLE_CHECKNIGHTMODE + "(" + KEY_NIGHTMODE + ");"; + + db.execSQL(CREATE_HABITS_TABLE); + db.execSQL(CREATE_AVOIDED_TABLE); + db.execSQL(CREATE_DONE_TABLE); + db.execSQL(CREATE_LABELS_TABLE); + db.execSQL(CREATE_NIGHTMODE_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_HABITS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_AVOIDED); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_DONE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHECKNIGHTMODE); + onCreate(db); + } + + // Method to restore the database from backup + public void restoreDatabase(File backupFile) { + File dbFile = context.getDatabasePath(DATABASE_NAME); + if (dbFile.exists() && dbFile.length() > 0) { + Log.d("Db_Helper", "Existing database found, not restoring."); + return; // Don't restore if the database already exists and is not empty + } + + try (FileInputStream fis = new FileInputStream(backupFile); + FileOutputStream fos = new FileOutputStream(dbFile)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); + } + Log.d("Db_Helper", "Database restored from backup."); + } catch (IOException e) { + Log.e("Db_Helper", "Error restoring database: " + e.getMessage()); + } + } + + // Open the database + public void open() throws SQLException { + database = this.getWritableDatabase(); + } + + // Close the database + public void closeDatabase() { + if (database != null && database.isOpen()) { + database.close(); + } + } + + // Insert methods + public void insertLabel(String label) { + ContentValues values = new ContentValues(); + values.put(KEY_LABEL, label); + this.getWritableDatabase().insertOrThrow(TABLE_LABELS, null, values); + } + + public void insertHabit(String date, String habit, String detail, int times, String category) { + ContentValues values = new ContentValues(); + values.put(KEY_DATE, date); + values.put(KEY_HABIT, habit); + values.put(KEY_DETAIL, detail); + values.put(KEY_TIMES, times); + values.put(KEY_CATEGORY, category); + this.getWritableDatabase().insertOrThrow(TABLE_HABITS, null, values); + } + + public void insertDoneData(String date, String habit, String detail, int times, String category) { + ContentValues values = new ContentValues(); + values.put(KEY_DATE, date); + values.put(KEY_HABIT, habit); + values.put(KEY_DETAIL, detail); + values.put(KEY_TIMES, times); + values.put(KEY_CATEGORY, category); + this.getWritableDatabase().insertOrThrow(TABLE_DONE, null, values); + } + + public void insertAvoidedData(String date, String habit, String detail, int times, String category) { + ContentValues values = new ContentValues(); + values.put(KEY_DATE, date); + values.put(KEY_HABIT, habit); + values.put(KEY_DETAIL, detail); + values.put(KEY_TIMES, times); + values.put(KEY_CATEGORY, category); + this.getWritableDatabase().insertOrThrow(TABLE_AVOIDED, null, values); + } + + public void setNightMode(String mode) { + ContentValues values = new ContentValues(); + values.put(KEY_NIGHTMODE, mode); + this.getWritableDatabase().insertOrThrow(TABLE_CHECKNIGHTMODE, null, values); + } + + // Fetch methods + public void getNightMode() { + Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM " + TABLE_CHECKNIGHTMODE, null); + if (cursor.moveToFirst()) { + Helper.isnightmodeon = cursor.getString(0); + } + cursor.close(); + } + + public void showHabitsData() { + Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM " + TABLE_HABITS, null); + Helper.habitsdata = new ArrayList<>(); + while (cursor.moveToNext()) { + String[] data = new String[5]; + data[0] = cursor.getString(0); + data[1] = cursor.getString(1); + data[2] = cursor.getString(2).replace("geodhola", "'"); + data[3] = cursor.getString(3); + data[4] = cursor.getString(4); + Helper.habitsdata.add(data); + } + cursor.close(); + } + + public void showAvoidedData() { + Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM " + TABLE_AVOIDED, null); + Helper.avoidedData = new ArrayList<>(); + while (cursor.moveToNext()) { + String[] data = new String[5]; + data[0] = cursor.getString(0); + data[1] = cursor.getString(1); + data[2] = cursor.getString(2); + data[3] = cursor.getString(3); + data[4] = cursor.getString(4); + Helper.avoidedData.add(data); + } + cursor.close(); + } + + // Update methods + public void updateHabit(int id, String date, String habit, String detail, String category) { + ContentValues values = new ContentValues(); + values.put(KEY_DATE, date); + values.put(KEY_HABIT, habit); + values.put(KEY_DETAIL, detail); + values.put(KEY_CATEGORY, category); + + this.getWritableDatabase().update(TABLE_HABITS, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + + public void updateDoneData(int id, String date, String habit, String detail, int times, String category) { + ContentValues values = new ContentValues(); + values.put(KEY_DATE, date); + values.put(KEY_HABIT, habit); + values.put(KEY_DETAIL, detail); + values.put(KEY_TIMES, times); + values.put(KEY_CATEGORY, category); + + this.getWritableDatabase().update(TABLE_DONE, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + + public void updateNightMode(String mode) { + ContentValues values = new ContentValues(); + values.put(KEY_NIGHTMODE, mode); + this.getWritableDatabase().update(TABLE_CHECKNIGHTMODE, values, null, null); + Helper.isnightmodeon = mode; + } + + // Delete methods + public void deleteHabit(int id) { + this.getWritableDatabase().delete(TABLE_HABITS, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + + public void deleteAvoided(int id) { + this.getWritableDatabase().delete(TABLE_AVOIDED, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + + public void deleteDone(int id) { + this.getWritableDatabase().delete(TABLE_DONE, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + + // Initialize the database with restoration + public void initializeDatabase(File backupFile) { + restoreDatabase(backupFile); + open(); // Open the database after restoring it + } +} \ No newline at end of file diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedFragment.java index 60067c46..cb545d25 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedFragment.java @@ -45,16 +45,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, rv = view.findViewById(R.id.rv); db = new Db_Controller(getActivity(), "", null, 2); db.show_labels(); - db.show_data(); + db.show_avoided_data(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); setDataInList(); return view; } public void setDataInList() { - for (int i = 0; i < Helper.data.size(); i++) { - gettingtasks.add(Helper.data.get(i)[2]); - gettingcatagory.add(Helper.data.get(i)[4]); + for (int i = 0; i < Helper.avoidedData.size(); i++) { + gettingtasks.add(Helper.avoidedData.get(i)[2]); + gettingcatagory.add(Helper.avoidedData.get(i)[4]); } rv.setLayoutManager(new LinearLayoutManager(getActivity())); new ItemTouchHelper(itemtouchhelper).attachToRecyclerView(rv); @@ -83,11 +83,11 @@ public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int dire new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { int i = viewHolder.getAdapterPosition(); - Log.d("aaaasize",""+Helper.data.size()); + Log.d("aaaasize",""+Helper.avoidedData.size()); db.delete_avoided(i); - for (int j = i + 1; j < Helper.data.size(); j++) { - Log.d("aaaaforloop",""+Integer.parseInt(Helper.data.get(j)[0])); - db.updateIdsAfterDeletion(Integer.parseInt(Helper.data.get(j)[0])); + for (int j = i + 1; j < Helper.avoidedData.size(); j++) { + Log.d("aaaaforloop",""+Integer.parseInt(Helper.avoidedData.get(j)[0])); + db.updateIdsAfterDeletion(Integer.parseInt(Helper.avoidedData.get(j)[0])); } Helper.SelectedButtonOfTodayTab = 1; Intent intent = new Intent(getActivity(), MainActivity.class); diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedLogFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedLogFragment.java index c1ee45ef..d128748d 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedLogFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/AvoidedLogFragment.java @@ -1,28 +1,19 @@ package rocks.poopjournal.todont.Fragments; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Locale; import rocks.poopjournal.todont.Adapters.AvoidedLogAdapter; import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; import rocks.poopjournal.todont.R; public class AvoidedLogFragment extends Fragment { diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/DoneFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/DoneFragment.java index f22bc20c..0e59d048 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/DoneFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/DoneFragment.java @@ -4,6 +4,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -11,18 +14,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Locale; -import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Adapters.DoneAdapter; +import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Helper; import rocks.poopjournal.todont.MainActivity; import rocks.poopjournal.todont.R; @@ -52,7 +51,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, // @SuppressLint("ResourceAsColor") // @Override // public void onClick(View view) { -// final SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault()); +// final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); // String formattedDate = df.format(c); // final View bottomsheetview ; // final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(), diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentLog.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentLog.java index 22a74e78..9efc449f 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentLog.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentLog.java @@ -1,6 +1,5 @@ package rocks.poopjournal.todont.Fragments; -import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentToday.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentToday.java index d63acb4d..86f477b3 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentToday.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/FragmentToday.java @@ -1,6 +1,5 @@ package rocks.poopjournal.todont.Fragments; -import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -10,9 +9,6 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; - -import java.util.Collection; - import rocks.poopjournal.todont.Helper; import rocks.poopjournal.todont.R; diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsFragment.java index d53907a1..142b26b2 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsFragment.java @@ -8,8 +8,6 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; -import android.util.TypedValue; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,6 +42,11 @@ import rocks.poopjournal.todont.R; import rocks.poopjournal.todont.showcaseview.ShowcaseViewBuilder; import rocks.poopjournal.todont.utils.SharedPrefUtils; +import smartdevelop.ir.eram.showcaseviewlib.GuideView; +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType; +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity; +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType; +import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener; public class HabitsFragment extends Fragment { @@ -55,7 +58,7 @@ public class HabitsFragment extends Fragment { String catagoryselected; Db_Controller db; HabitsAdapter adapter; - TextView tv1, tv2; + TextView tv2; public ShowcaseViewBuilder showcaseViewBuilder; private SharedPrefUtils prefUtils; @@ -68,19 +71,20 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa db = new Db_Controller(getActivity(), "", null, 2); db.show_labels(); db.show_habits_data(); + showcaseViewBuilder = ShowcaseViewBuilder.init(requireActivity()); prefUtils = new SharedPrefUtils(requireActivity()); db.getNightMode(); - tv1 = view.findViewById(R.id.a); + // tv1 = view.findViewById(R.id.a); tv2 = view.findViewById(R.id.b); floatingActionButton = view.findViewById(R.id.floatingbtn); floatingActionButton.bringToFront(); floatingActionButton.setVisibility(View.VISIBLE); if (Helper.habitsdata.size() != 0) { - tv1.setVisibility(View.INVISIBLE); + // tv1.setVisibility(View.INVISIBLE); tv2.setVisibility(View.INVISIBLE); } else if (Helper.habitsdata.size() == 0) { - tv1.setVisibility(View.VISIBLE); + // tv1.setVisibility(View.VISIBLE); tv2.setVisibility(View.VISIBLE); } @@ -280,38 +284,56 @@ public void onClick(View view) { } private void showcaseFab() { - showcaseViewBuilder.setTargetView(floatingActionButton).setBackgroundOverlayColor(0xcc000000) - .setBgOverlayShape(ShowcaseViewBuilder.ROUND_RECT) - .setRoundRectCornerDirection(ShowcaseViewBuilder.TOP_RIGHT) - .setRoundRectOffset(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, getResources().getDisplayMetrics())).setRingColor(0xcc8e8e8e) - .setShowcaseShape(ShowcaseViewBuilder.SHAPE_CIRCLE).setRingWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18, getResources().getDisplayMetrics())) - .setMarkerDrawable(getResources().getDrawable(R.drawable.arrow_up), Gravity.LEFT) - .addCustomView(R.layout.fab_description_view, Gravity.LEFT, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -228, getResources() - .getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics()), -300); -// .addCustomView(R.layout.fab_description_view, Gravity.CENTER); - - showcaseViewBuilder.show(); - - showcaseViewBuilder.setClickListenerOnView(R.id.btn, new View.OnClickListener() { - @Override - public void onClick(View v) { - prefUtils.setBool("plus", true); - showcaseViewBuilder.hide(); - } - }); +// showcaseViewBuilder.setTargetView(floatingActionButton).setBackgroundOverlayColor(0xcc000000) +// .setBgOverlayShape(ShowcaseViewBuilder.ROUND_RECT) +// .setRoundRectCornerDirection(ShowcaseViewBuilder.TOP_RIGHT) +// .setRoundRectOffset(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, getResources().getDisplayMetrics())).setRingColor(0xcc8e8e8e) +// .setShowcaseShape(ShowcaseViewBuilder.SHAPE_CIRCLE).setRingWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18, getResources().getDisplayMetrics())) +// .setMarkerDrawable(getResources().getDrawable(R.drawable.arrow_up), Gravity.LEFT) +// .addCustomView(R.layout.fab_description_view, Gravity.LEFT, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -228, getResources() +// .getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics()), -300); +//// .addCustomView(R.layout.fab_description_view, Gravity.CENTER); +// +// showcaseViewBuilder.show(); +// +// showcaseViewBuilder.setClickListenerOnView(R.id.btn, new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// prefUtils.setBool("plus", true); +// showcaseViewBuilder.hide(); +// } +// }); + GuideView.Builder guideView=new GuideView.Builder(requireContext()) + .setContentText("To Start Off, put down a bad habit.") + .setTargetView(floatingActionButton) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool("plus", true); + } + }); + + + guideView.build().show(); + } public void setDataInList() { for (int i = 0; i < Helper.habitsdata.size(); i++) { gettingtasks.add(Helper.habitsdata.get(i)[2]); - gettingcatagory.add(Helper.habitsdata.get(i)[4]); + gettingcatagory.add(Helper.habitsdata.get(i)[5]); } - rv.setLayoutManager(new LinearLayoutManager(getActivity())); - new ItemTouchHelper(itemtouchhelper).attachToRecyclerView(rv); - adapter = new HabitsAdapter(getActivity(), HabitsFragment.this, db, gettingtasks, gettingcatagory); - rv.setAdapter(adapter); - rv.setLayoutManager(new LinearLayoutManager(getActivity())); + if(!Helper.habitsdata.isEmpty()){ + rv.setLayoutManager(new LinearLayoutManager(getActivity())); + new ItemTouchHelper(itemtouchhelper).attachToRecyclerView(rv); + adapter = new HabitsAdapter(getActivity(), HabitsFragment.this, db, gettingtasks, gettingcatagory); + rv.setAdapter(adapter); + rv.setLayoutManager(new LinearLayoutManager(getActivity())); + } } ItemTouchHelper.SimpleCallback itemtouchhelper = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsLogFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsLogFragment.java index fdf41b51..6764c78b 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsLogFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/HabitsLogFragment.java @@ -1,44 +1,20 @@ package rocks.poopjournal.todont.Fragments; -import android.annotation.SuppressLint; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.sqlite.SQLiteException; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; -import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.Locale; -import rocks.poopjournal.todont.Adapters.HabitsAdapter; import rocks.poopjournal.todont.Adapters.HabitsLogAdapter; import rocks.poopjournal.todont.Db_Controller; import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; import rocks.poopjournal.todont.R; diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/LabelsAdapter.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/LabelsAdapter.java index 074a4bdd..353eb53c 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/LabelsAdapter.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/LabelsAdapter.java @@ -1,10 +1,6 @@ package rocks.poopjournal.todont.Fragments; -import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,8 +13,6 @@ import java.util.ArrayList; import rocks.poopjournal.todont.Db_Controller; -import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.Labels; import rocks.poopjournal.todont.R; @@ -36,14 +30,14 @@ public LabelsAdapter(Context con, Db_Controller db, ArrayList labels_lis @NonNull @Override - public LabelsAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.labels_recyclerview_layout, viewGroup, false); return new RecyclerViewHolder(view); } @Override - public void onBindViewHolder(@NonNull LabelsAdapter.RecyclerViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) { final String dTask=labels_list.get(position); holder.tv_label.setText(dTask.replace("''","'")); db.getNightMode(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/MonthlyFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/MonthlyFragment.java index 0e00e501..88b9441e 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/MonthlyFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/MonthlyFragment.java @@ -1,5 +1,7 @@ package rocks.poopjournal.todont.Fragments; +import static java.util.Calendar.getInstance; + import android.content.Context; import android.content.SharedPreferences; import android.graphics.Color; @@ -11,6 +13,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; + import androidx.fragment.app.Fragment; import com.github.mikephil.charting.charts.PieChart; @@ -30,8 +33,6 @@ import rocks.poopjournal.todont.Helper; import rocks.poopjournal.todont.R; -import static java.util.Calendar.getInstance; - public class MonthlyFragment extends Fragment { Calendar c = getInstance(); Calendar d = getInstance(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/WeeklyFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/WeeklyFragment.java index 4044e432..297a464b 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/WeeklyFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/WeeklyFragment.java @@ -1,18 +1,18 @@ package rocks.poopjournal.todont.Fragments; +import static java.util.Calendar.getInstance; + import android.content.Context; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.util.Log; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; import androidx.fragment.app.Fragment; @@ -33,8 +33,6 @@ import rocks.poopjournal.todont.Helper; import rocks.poopjournal.todont.R; -import static java.util.Calendar.getInstance; - public class WeeklyFragment extends Fragment { Calendar c = getInstance(); Calendar d = getInstance(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/YearlyFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/YearlyFragment.java index ad6263e1..3be8a6a4 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/YearlyFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/YearlyFragment.java @@ -1,5 +1,7 @@ package rocks.poopjournal.todont.Fragments; +import static java.util.Calendar.getInstance; + import android.content.Context; import android.content.SharedPreferences; import android.graphics.Color; @@ -11,13 +13,16 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; + import androidx.fragment.app.Fragment; + import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.Description; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; + import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -28,8 +33,6 @@ import rocks.poopjournal.todont.Helper; import rocks.poopjournal.todont.R; -import static java.util.Calendar.getInstance; - public class YearlyFragment extends Fragment { Calendar c = getInstance(); Calendar d = getInstance(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Fragments/menuFragment.java b/app/src/main/java/rocks/poopjournal/todont/Fragments/menuFragment.java index 4bbe5a8e..237c716d 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Fragments/menuFragment.java +++ b/app/src/main/java/rocks/poopjournal/todont/Fragments/menuFragment.java @@ -1,30 +1,12 @@ package rocks.poopjournal.todont.Fragments; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.Locale; - -import rocks.poopjournal.todont.Adapters.AvoidedAdapter; -import rocks.poopjournal.todont.Db_Controller; -import rocks.poopjournal.todont.Helper; -import rocks.poopjournal.todont.MainActivity; + import rocks.poopjournal.todont.R; public class menuFragment extends Fragment { diff --git a/app/src/main/java/rocks/poopjournal/todont/Helper.java b/app/src/main/java/rocks/poopjournal/todont/Helper.java index d057ae15..20800e2f 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Helper.java +++ b/app/src/main/java/rocks/poopjournal/todont/Helper.java @@ -1,12 +1,10 @@ package rocks.poopjournal.todont; -import android.content.Context; - import java.util.ArrayList; public class Helper { public static ArrayList labels_array = new ArrayList(); - public static ArrayList data=new ArrayList<>(); + public static ArrayList avoidedData =new ArrayList<>(); public static ArrayList avoidedlogdata=new ArrayList<>(); public static ArrayList donedata=new ArrayList<>(); public static ArrayList donelogdata=new ArrayList<>(); diff --git a/app/src/main/java/rocks/poopjournal/todont/Labels.java b/app/src/main/java/rocks/poopjournal/todont/Labels.java index 6b5df461..83694a93 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Labels.java +++ b/app/src/main/java/rocks/poopjournal/todont/Labels.java @@ -8,38 +8,33 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; -import android.util.Log; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; -import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; -import rocks.poopjournal.todont.Adapters.HabitsAdapter; -import rocks.poopjournal.todont.Fragments.HabitsFragment; import rocks.poopjournal.todont.Fragments.LabelsAdapter; import rocks.poopjournal.todont.showcaseview.RippleBackground; import rocks.poopjournal.todont.showcaseview.ShowcaseViewBuilder; import rocks.poopjournal.todont.utils.SharedPrefUtils; +import smartdevelop.ir.eram.showcaseviewlib.GuideView; +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType; +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity; +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType; +import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener; public class Labels extends AppCompatActivity { RecyclerView rv_labels; @@ -217,28 +212,44 @@ public void backbtnclicked(View view) { startActivity(i); } private void showcaseFab() { - showcaseViewBuilder.setTargetView(labels_floatingbutton) - .setBackgroundOverlayColor(0xcc000000) - .setBgOverlayShape(ShowcaseViewBuilder.ROUND_RECT) - .setRoundRectCornerDirection(ShowcaseViewBuilder.TOP_LEFT) - .setRoundRectOffset(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, getResources().getDisplayMetrics())) - .setRingColor(0xcc8e8e8e) - .setShowcaseShape(ShowcaseViewBuilder.SHAPE_CIRCLE) - .setRingWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics())) - .setMarkerDrawable(getResources().getDrawable(R.drawable.arrow_up), Gravity.LEFT) - .addCustomView(R.layout.fab_label_description_view, Gravity.LEFT, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -228, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -160, getResources().getDisplayMetrics()) ,0); -// .addCustomView(R.layout.fab_description_view, Gravity.CENTER); - - showcaseViewBuilder.show(); - - showcaseViewBuilder.setClickListenerOnView(R.id.btn, new View.OnClickListener() { - @Override - public void onClick(View v) { - prefUtils.setBool("plus1", true); +// showcaseViewBuilder.setTargetView(labels_floatingbutton) +// .setBackgroundOverlayColor(0xcc000000) +// .setBgOverlayShape(ShowcaseViewBuilder.ROUND_RECT) +// .setRoundRectCornerDirection(ShowcaseViewBuilder.TOP_LEFT) +// .setRoundRectOffset(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, getResources().getDisplayMetrics())) +// .setRingColor(0xcc8e8e8e) +// .setShowcaseShape(ShowcaseViewBuilder.SHAPE_CIRCLE) +// .setRingWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics())) +// .setMarkerDrawable(getResources().getDrawable(R.drawable.arrow_up), Gravity.LEFT) +// .addCustomView(R.layout.fab_label_description_view, Gravity.LEFT, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -228, getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -160, getResources().getDisplayMetrics()) ,0); +//// .addCustomView(R.layout.fab_description_view, Gravity.CENTER); +// +// showcaseViewBuilder.show(); +// +// showcaseViewBuilder.setClickListenerOnView(R.id.btn, new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// prefUtils.setBool("plus1", true); +// +// showcaseViewBuilder.hide(); +// } +// }); + + + GuideView.Builder guideView = new GuideView.Builder(Labels.this) + .setContentText("Add Label.") + .setTargetView(labels_floatingbutton) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool("plus1", true); + } + }); + guideView.build().show(); - showcaseViewBuilder.hide(); - } - }); /* if (!fabHighlighter.isRippleAnimationRunning()) { fabHighlighter.startRippleAnimation(); diff --git a/app/src/main/java/rocks/poopjournal/todont/MainActivity.kt b/app/src/main/java/rocks/poopjournal/todont/MainActivity.kt index 1973c358..45077130 100644 --- a/app/src/main/java/rocks/poopjournal/todont/MainActivity.kt +++ b/app/src/main/java/rocks/poopjournal/todont/MainActivity.kt @@ -9,22 +9,28 @@ import com.google.android.material.bottomnavigation.BottomNavigationView import rocks.poopjournal.todont.Fragments.FragmentLog import rocks.poopjournal.todont.Fragments.FragmentToday import rocks.poopjournal.todont.databinding.ActivityMainBinding +import rocks.poopjournal.todont.utils.SharedPrefUtils +import smartdevelop.ir.eram.showcaseviewlib.GuideView +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType class MainActivity : AppCompatActivity() { // Database controller instance var db: Db_Controller? = null lateinit var binding: ActivityMainBinding + var prefUtils: SharedPrefUtils?=null; override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) binding = DataBindingUtil.setContentView(this, R.layout.activity_main) // Initialize the database controller val fragment = FragmentToday() + prefUtils = SharedPrefUtils(this); db = Db_Controller(applicationContext, "", null, 2) - // Replace the current fragment with the 'FragmentToday' - supportFragmentManager.beginTransaction() - .replace(R.id.container, fragment, fragment.javaClass.simpleName).commit() + + // Set toolbar text to "Today" @@ -67,17 +73,29 @@ class MainActivity : AppCompatActivity() { } R.id.navigation_log -> { - // Switch to the 'FragmentLog' when "Log" is selected - val fragment = FragmentLog() - supportFragmentManager.beginTransaction() - .replace(R.id.container, fragment, fragment.javaClass.simpleName) - .commit() - // Update the toolbar text - binding.toolbartext.setText(R.string.log) - // Hide the label and settings views - binding.label.visibility = View.INVISIBLE - binding.settings.visibility = View.INVISIBLE - return@OnNavigationItemSelectedListener true + if(!(prefUtils!!.getBool(SharedPrefUtils.KEY_LOG))&&!intent.getBooleanExtra("openLog",false)){ + + val guideView = GuideView.Builder(this@MainActivity) + .setContentText("View your stats.") + .setTargetView(binding.navigationView.findViewById(R.id.navigation_log)) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener { prefUtils!!.setBool(SharedPrefUtils.KEY_LOG, true) } + guideView.build().show() + }else{ + // Switch to the 'FragmentLog' when "Log" is selected + val fragment = FragmentLog() + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment, fragment.javaClass.simpleName) + .commit() + // Update the toolbar text + binding.toolbartext.setText(R.string.log) + // Hide the label and settings views + binding.label.visibility = View.INVISIBLE + binding.settings.visibility = View.INVISIBLE + return@OnNavigationItemSelectedListener true + } } } false @@ -92,6 +110,23 @@ class MainActivity : AppCompatActivity() { startActivity(intent) finish() } + if(intent.getBooleanExtra("openLog",false)){ +// // Switch to the 'FragmentLog' when "Log" is selected +// val frag = FragmentLog() +// supportFragmentManager.beginTransaction() +// .replace(R.id.container, frag, frag.javaClass.simpleName) +// .commit() +// // Update the toolbar text +// binding.toolbartext.setText(R.string.log) +// // Hide the label and settings views +// binding.label.visibility = View.INVISIBLE +// binding.settings.visibility = View.INVISIBLE + binding.navigationView.selectedItemId = R.id.navigation_log + }else{ + // Replace the current fragment with the 'FragmentToday' + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment, fragment.javaClass.simpleName).commit() + } } // Handle the "Settings" action when a view is clicked diff --git a/app/src/main/java/rocks/poopjournal/todont/NotificationReceiver.java b/app/src/main/java/rocks/poopjournal/todont/NotificationReceiver.java new file mode 100644 index 00000000..2a52c8ed --- /dev/null +++ b/app/src/main/java/rocks/poopjournal/todont/NotificationReceiver.java @@ -0,0 +1,43 @@ +package rocks.poopjournal.todont; + +import static androidx.core.content.ContextCompat.getSystemService; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +public class NotificationReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + NotificationChannel channel = new NotificationChannel("Tasks", "tasks reminder", NotificationManager.IMPORTANCE_HIGH); + NotificationManager manager = getSystemService(context,NotificationManager.class); + manager.createNotificationChannel(channel); + String task=intent.getStringExtra("task"); + // Create notification when the alarm is triggered + Intent pendingIntent=new Intent(context,MainActivity.class); + pendingIntent.putExtra("openLog",true); + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "Tasks") + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("ToDon't Reminder") + .setContentText("Mark your ToDon't task "+task) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setContentIntent(PendingIntent.getActivity(context, 0, pendingIntent, PendingIntent.FLAG_IMMUTABLE)); // Pass the pending intent here + + + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + return; + } + notificationManager.notify(1, builder.build()); + } +} + diff --git a/app/src/main/java/rocks/poopjournal/todont/OnBoardingActivity.java b/app/src/main/java/rocks/poopjournal/todont/OnBoardingActivity.java index c0212f51..167bb2ef 100644 --- a/app/src/main/java/rocks/poopjournal/todont/OnBoardingActivity.java +++ b/app/src/main/java/rocks/poopjournal/todont/OnBoardingActivity.java @@ -1,23 +1,22 @@ package rocks.poopjournal.todont; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.ContextCompat; +import static java.util.Calendar.getInstance; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.Button; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; + import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; -import static java.util.Calendar.getInstance; - public class OnBoardingActivity extends AppCompatActivity { Button btn; SharedPreferences sharedPreferences; diff --git a/app/src/main/java/rocks/poopjournal/todont/Settings.java b/app/src/main/java/rocks/poopjournal/todont/Settings.java index 25416761..9eac5e72 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Settings.java +++ b/app/src/main/java/rocks/poopjournal/todont/Settings.java @@ -1,24 +1,22 @@ package rocks.poopjournal.todont; -import androidx.annotation.RequiresApi; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; - import android.app.Dialog; import android.app.LocaleManager; +import android.content.ContentResolver; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; -import android.media.audiofx.EnvironmentalReverb; +import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.os.LocaleList; +import android.provider.DocumentsContract; import android.util.Log; -import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; -import android.widget.AdapterView; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RadioButton; @@ -26,28 +24,84 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; import java.util.List; import java.util.Locale; +import rocks.poopjournal.todont.utils.SharedPrefUtils; +import smartdevelop.ir.eram.showcaseviewlib.GuideView; +import smartdevelop.ir.eram.showcaseviewlib.config.DismissType; +import smartdevelop.ir.eram.showcaseviewlib.config.Gravity; +import smartdevelop.ir.eram.showcaseviewlib.config.PointerType; +import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener; + public class Settings extends AppCompatActivity { Db_Controller db; TextView modetitle; + private static final int REQUEST_CODE = 100; LinearLayout language; Spinner lang; - + private SharedPrefUtils prefUtils; View view; + private List localeList = Arrays.asList("cs", "da", "de", "en", "es", "it", "fr"); + private static final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 100; + private static final int REQUEST_CODE_PICK_DB_FILE = 200; + private Db_Helper dbHelper; // Database helper to manage DB connection + private static final String TAG = "DatabaseManager"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); - db = new Db_Controller(getApplicationContext(), "", null, 2); + prefUtils = new SharedPrefUtils(this); + db = new Db_Controller(getApplicationContext(), "", null, 3); language = findViewById(R.id.language); view = findViewById(R.id.viww); lang = findViewById(R.id.spLanguagePicker); + // Initialize your DatabaseHelper (assuming it's properly configured) + dbHelper = new Db_Helper(this); + + + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + Intent i = new Intent(Settings.this, MainActivity.class); + finishAffinity(); + startActivity(i); + overridePendingTransition(R.anim.fade_in, R.anim.fade_out); + } + }); + + findViewById(R.id.btnBack).setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + Intent i = new Intent(Settings.this, MainActivity.class); + finishAffinity(); + startActivity(i); + overridePendingTransition(R.anim.fade_in, R.anim.fade_out); + } + }); + + +// checkPermissionAndRestoreDatabase(); + + /* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { language.setVisibility(View.VISIBLE); view.setVisibility(View.VISIBLE); @@ -65,9 +119,9 @@ public void onNothingSelected(AdapterView p0) { } });*/ - modetitle=findViewById(R.id.modetitle); - Log.d("heyyyymode",""+Helper.isnightmodeon); - switch(Helper.isnightmodeon){ + modetitle = findViewById(R.id.modetitle); + Log.d("heyyyymode", "" + Helper.isnightmodeon); + switch (Helper.isnightmodeon) { case "followsys": modetitle.setText(R.string.followsys); break; @@ -81,69 +135,87 @@ public void onNothingSelected(AdapterView p0) { // db.getNightMode(); } + public void changeMode(View view) { - final Dialog d = new Dialog(this); - d.requestWindowFeature(Window.FEATURE_NO_TITLE); - d.setContentView(R.layout.dialogbox); - d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - Button btndone=d.findViewById(R.id.btndone); - RadioButton light,dark,fsys,dracula; - light=d.findViewById(R.id.light); - dark=d.findViewById(R.id.dark); - dracula=d.findViewById(R.id.dracula); - fsys=d.findViewById(R.id.followsys); - String getmodetitle= modetitle.getText().toString(); - if(getmodetitle.equals("Follow System")){ - fsys.setChecked(true); - } - if(getmodetitle.equals("Light")){ - light.setChecked(true); - } - if(getmodetitle.equals("Dark")){ - dark.setChecked(true); - } - if(getmodetitle.equals("Dracula")){ - dracula.setChecked(true); - } - WindowManager.LayoutParams lp = d.getWindow().getAttributes(); - lp.dimAmount=0.9f; - d.getWindow().setAttributes(lp); + if (prefUtils.getBool(SharedPrefUtils.KEY_APPEAR_VIEW)) { + GuideView.Builder guideView = new GuideView.Builder(this) + .setContentText("Help make \"To Don't\" better.") + .setTargetView(view) + .setDismissType(DismissType.anywhere) + .setPointerType(PointerType.arrow) + .setGravity(Gravity.center) + .setGuideListener(new GuideListener() { + @Override + public void onDismiss(View view) { + prefUtils.setBool(SharedPrefUtils.KEY_APPEAR_VIEW, true); + } + }); + guideView.build().show(); + } else { + final Dialog d = new Dialog(this); + d.requestWindowFeature(Window.FEATURE_NO_TITLE); + d.setContentView(R.layout.dialogbox); + d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + Button btndone = d.findViewById(R.id.btndone); + RadioButton light, dark, fsys, dracula; + light = d.findViewById(R.id.light); + dark = d.findViewById(R.id.dark); + dracula = d.findViewById(R.id.dracula); + fsys = d.findViewById(R.id.followsys); + String getmodetitle = modetitle.getText().toString(); + if (getmodetitle.equals("Follow System")) { + fsys.setChecked(true); + } + if (getmodetitle.equals("Light")) { + light.setChecked(true); + } + if (getmodetitle.equals("Dark")) { + dark.setChecked(true); + } + if (getmodetitle.equals("Dracula")) { + dracula.setChecked(true); + } + WindowManager.LayoutParams lp = d.getWindow().getAttributes(); + lp.dimAmount = 0.9f; + d.getWindow().setAttributes(lp); - btndone.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - db.getNightMode(); - Log.d("modeisbuttondone:",""+Helper.isnightmodeon); - if(Helper.isnightmodeon.equals("followsys")){ - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - Log.d("checkmode","f .. "+AppCompatDelegate.getDefaultNightMode()); - Toast.makeText(getApplicationContext(), (R.string.toast_system), Toast.LENGTH_SHORT).show(); - modetitle.setText(R.string.followsys); - d.dismiss(); - } - if(Helper.isnightmodeon.equals("light")){ - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - Log.d("checkmode","l .. "+AppCompatDelegate.getDefaultNightMode()); - modetitle.setText(R.string.dark); - Toast.makeText(getApplicationContext(), (R.string.toast_light), Toast.LENGTH_SHORT).show(); - d.dismiss(); - } - if(Helper.isnightmodeon.equals("dark")){ - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - Toast.makeText(getApplicationContext(), R.string.toast_dark, Toast.LENGTH_SHORT).show(); - modetitle.setText(R.string.light); - d.dismiss(); - } - if(Helper.isnightmodeon.equals("Dracula")){ - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + btndone.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + db.getNightMode(); + Log.d("modeisbuttondone:", "" + Helper.isnightmodeon); + if (Helper.isnightmodeon.equals("followsys")) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + Log.d("checkmode", "f .. " + AppCompatDelegate.getDefaultNightMode()); + Toast.makeText(getApplicationContext(), (R.string.toast_system), Toast.LENGTH_SHORT).show(); + modetitle.setText(R.string.followsys); + d.dismiss(); + } + if (Helper.isnightmodeon.equals("light")) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + Log.d("checkmode", "l .. " + AppCompatDelegate.getDefaultNightMode()); + modetitle.setText(R.string.dark); + Toast.makeText(getApplicationContext(), (R.string.toast_light), Toast.LENGTH_SHORT).show(); + d.dismiss(); + } + if (Helper.isnightmodeon.equals("dark")) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + Toast.makeText(getApplicationContext(), R.string.toast_dark, Toast.LENGTH_SHORT).show(); + modetitle.setText(R.string.light); + d.dismiss(); + } + if (Helper.isnightmodeon.equals("Dracula")) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); // setTheme(R.style.DraculaTheme); - Toast.makeText(getApplicationContext(), R.string.toast_dark, Toast.LENGTH_SHORT).show(); - modetitle.setText(R.string.light); - d.dismiss(); + Toast.makeText(getApplicationContext(), R.string.toast_dark, Toast.LENGTH_SHORT).show(); + modetitle.setText(R.string.light); + d.dismiss(); + } } - } - });d.show(); + }); + d.show(); + } // db.getNightMode(); // Log.d("qqq","infunc : "+Helper.isnightmodeon ); @@ -179,46 +251,59 @@ public void onRadioButtonClicked(View view) { // Is the button now checked? boolean checked = ((RadioButton) view).isChecked(); // Check which radio button was clicked - switch(view.getId()) { + switch (view.getId()) { case R.id.followsys: - if (checked) - { + if (checked) { modetitle.setText("Follow System"); db.update_nightmode("followsys"); - Log.d("modeisf:",""+Helper.isnightmodeon); + Log.d("modeisf:", "" + Helper.isnightmodeon); break; } case R.id.light: - if (checked) - { + if (checked) { modetitle.setText("Light"); db.update_nightmode("light"); - Log.d("modeisl:",""+Helper.isnightmodeon); + Log.d("modeisl:", "" + Helper.isnightmodeon); break; } case R.id.dark: - if (checked) - { + if (checked) { modetitle.setText("Dark"); db.update_nightmode("dark"); - Log.d("modeisd:",""+Helper.isnightmodeon); + Log.d("modeisd:", "" + Helper.isnightmodeon); break; } case R.id.dracula: - if (checked) - { + if (checked) { modetitle.setText("Dracula"); db.update_nightmode("Dracula"); - Log.d("modei sd:",""+Helper.isnightmodeon); + Log.d("modei sd:", "" + Helper.isnightmodeon); break; } } } + public void backbtn(View view) { - Intent i = new Intent(Settings.this, MainActivity.class); + /* Intent i = new Intent(Settings.this, MainActivity.class); finishAffinity(); startActivity(i); - overridePendingTransition(R.anim.fade_in, R.anim.fade_out); + overridePendingTransition(R.anim.fade_in, R.anim.fade_out);*/ + +/* + // Check if the write permission is granted + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + + // Request permission + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + REQUEST_CODE_WRITE_EXTERNAL_STORAGE); + } else { + // Permission already granted, proceed with copying the database + copyDatabase(); + }*/ + + copyDatabase(); } @@ -229,16 +314,147 @@ public void aboutus(View view) { overridePendingTransition(R.anim.fade_in, R.anim.fade_out); } - @Override - public void onBackPressed() { - Intent i = new Intent(Settings.this, MainActivity.class); - finishAffinity(); - startActivity(i); - overridePendingTransition(R.anim.fade_in, R.anim.fade_out); + + public void restore(View view) { + + openFilePicker(); } + @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) private void setAppLocale(Locale locale) { - LocaleManager localeManager = getSystemService(LocaleManager.class); + LocaleManager localeManager = (LocaleManager) getSystemService(String.valueOf(LocaleManager.class)); localeManager.setApplicationLocales(new LocaleList(locale)); } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // Permission granted, copy the database + copyDatabase(); + } else { + // Permission denied, show a message + Toast.makeText(this, "Permission denied to write to external storage", Toast.LENGTH_LONG).show(); + } + } + if (requestCode == REQUEST_CODE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // Permission granted, restore the database + Log.e(TAG, "granted"); + + } else { + // Permission denied, handle accordingly + Log.e(TAG, "Permission denied to read external storage"); + // Check if the user denied the permission permanently + if (!ActivityCompat.shouldShowRequestPermissionRationale(this, "android.permission.WRITE_EXTERNAL_STORAGE")) { + // Permission denied permanently, inform the user and direct them to settings + showPermissionDeniedDialog(); + } else { + // Permission denied but not permanently + Toast.makeText(this, "Permission is required to restore the database.", Toast.LENGTH_SHORT).show(); + } + } + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == REQUEST_CODE_PICK_DB_FILE && resultCode == RESULT_OK && data != null) { + Uri fileUri = data.getData(); + if (fileUri != null) { + // Close the database before restoring + dbHelper.closeDatabase(); + + // Restore the selected file to the app's database directory + restoreDatabase(fileUri); + dbHelper = new Db_Helper(this); + // Reopen the database after restoring + dbHelper.getWritableDatabase(); // This reopens the DB connection + } + } + } + + + private void showPermissionDeniedDialog() { + new AlertDialog.Builder(this) + .setTitle("Permission Required") + .setMessage("This app requires access to your external storage to restore the database. Please enable this permission in the app settings.") + .setPositiveButton("Open Settings", (dialog, which) -> { + Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + }) + .setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss()) + .show(); + } + + + // Method to copy the selected file back to the app's database directory + private void restoreDatabase(Uri fileUri) { + ContentResolver contentResolver = getContentResolver(); + dbHelper.close(); + dbHelper = null; + DatabaseManager databaseManager = new DatabaseManager(this); + databaseManager.deleteCurrentDatabase(); + try (InputStream inputStream = contentResolver.openInputStream(fileUri)) { + + // Get the app's internal database directory + File dbFile = getDatabasePath("todont.sqlite"); // Replace with actual DB name + + // If the file doesn't exist, create it + if (!dbFile.exists()) { + dbFile.getParentFile().mkdirs(); + dbFile.createNewFile(); + } + + // Copy the selected file to the app's database directory + try (OutputStream outputStream = new FileOutputStream(dbFile)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + /* File backupFile = new File(this.getFilesDir(), "todont.sqlite"); // Ensure this file exists before using + dbHelper.initializeDatabase(backupFile);*/ + + Toast.makeText(this, "Database restored successfully", Toast.LENGTH_LONG).show(); + } + + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(this, "Failed to restore database: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + + private void checkPermissionAndRestoreDatabase() { + if (ContextCompat.checkSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE") + != PackageManager.PERMISSION_GRANTED) { + // Request permission + ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, REQUEST_CODE); + } + } + + // Method to copy the database + private void copyDatabase() { + DatabaseUtils.copyDatabaseToDownloads(this, "todont.sqlite"); // Replace with actual DB name + } + + + // Method to open the file picker and allow the user to select the database file + private void openFilePicker() { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("application/octet-stream"); // MIME type for .db files + + // Optional: Specify a specific folder (App's folder in Downloads) + Uri downloadsFolderUri = Uri.parse(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS))); + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, downloadsFolderUri); + + startActivityForResult(intent, REQUEST_CODE_PICK_DB_FILE); + } } diff --git a/app/src/main/java/rocks/poopjournal/todont/Splash_Screen.java b/app/src/main/java/rocks/poopjournal/todont/Splash_Screen.java index 887cda4f..2188f25c 100644 --- a/app/src/main/java/rocks/poopjournal/todont/Splash_Screen.java +++ b/app/src/main/java/rocks/poopjournal/todont/Splash_Screen.java @@ -5,7 +5,6 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; -import android.util.Log; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; diff --git a/app/src/main/java/rocks/poopjournal/todont/utils/Constant.java b/app/src/main/java/rocks/poopjournal/todont/utils/Constant.java index 1089de42..fba0bd2d 100644 --- a/app/src/main/java/rocks/poopjournal/todont/utils/Constant.java +++ b/app/src/main/java/rocks/poopjournal/todont/utils/Constant.java @@ -1,7 +1,6 @@ package rocks.poopjournal.todont.utils; -import java.util.ArrayList; public class Constant { // ********************************** Main Shared Pref Constants ******************************** diff --git a/app/src/main/java/rocks/poopjournal/todont/utils/SharedPrefUtils.java b/app/src/main/java/rocks/poopjournal/todont/utils/SharedPrefUtils.java index 02dd980a..452b59dc 100644 --- a/app/src/main/java/rocks/poopjournal/todont/utils/SharedPrefUtils.java +++ b/app/src/main/java/rocks/poopjournal/todont/utils/SharedPrefUtils.java @@ -14,9 +14,16 @@ public class SharedPrefUtils { public static final String MY_PREFS_NAME = "MiApp"; + public static final String KEY_ADD_OR_AVOIDED="AddOrAvoided"; + public static final String KEY_LOG="Log"; + public static final String KEY_CONTRIBUTION_VIEW="CONTRIBUTION_VIEW"; + public static final String KEY_APPEAR_VIEW="APPEAR_VIEW"; + private final Context activity; + + public SharedPrefUtils(Context activity) { this.activity = activity; } @@ -92,4 +99,7 @@ public Map getMap(String key){ return outputMap; } + + + } diff --git a/app/src/main/java/rocks/poopjournal/todont/utils/Utils.java b/app/src/main/java/rocks/poopjournal/todont/utils/Utils.java index 27518a29..f36bbf4d 100644 --- a/app/src/main/java/rocks/poopjournal/todont/utils/Utils.java +++ b/app/src/main/java/rocks/poopjournal/todont/utils/Utils.java @@ -1,15 +1,16 @@ package rocks.poopjournal.todont.utils; + import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.content.res.AppCompatResources; import androidx.core.graphics.drawable.DrawableCompat; + import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; - import java.util.Date; import java.util.Locale; diff --git a/app/src/main/res/drawable/bell.xml b/app/src/main/res/drawable/bell.xml new file mode 100644 index 00000000..6f70868f --- /dev/null +++ b/app/src/main/res/drawable/bell.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/bottom_sheet.xml b/app/src/main/res/drawable/bottom_sheet.xml index 03d5ecf8..6dd8d6c0 100644 --- a/app/src/main/res/drawable/bottom_sheet.xml +++ b/app/src/main/res/drawable/bottom_sheet.xml @@ -6,5 +6,4 @@ android:topLeftRadius="20dp" android:topRightRadius="20dp" /> - \ No newline at end of file diff --git a/app/src/main/res/drawable/dis.xml b/app/src/main/res/drawable/dis.xml new file mode 100644 index 00000000..a71c3712 --- /dev/null +++ b/app/src/main/res/drawable/dis.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 942ec086..d07eccae 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -550,120 +550,128 @@ - - - + + + android:text="@string/contribute" + android:textColor="@color/colorPrimary" + android:textSize="18sp" /> -