From a2ecb3e527e75f3ab0d87e0aeb15ec5f2f36dfb6 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Sat, 13 Aug 2022 22:38:31 +0500 Subject: [PATCH] Reset all or one record for most visited repos --- .../adapters/MostVisitedReposAdapter.java | 38 +++++++++++++- .../gitnex/database/api/RepositoriesApi.java | 4 ++ .../gitnex/database/dao/RepositoriesDao.java | 3 ++ .../fragments/MostVisitedReposFragment.java | 52 ++++++++++++++++++- app/src/main/res/drawable/ic_reset.xml | 13 +++++ .../res/layout/list_most_visited_repos.xml | 28 ++++++++-- app/src/main/res/layout/list_repositories.xml | 42 +++++++-------- app/src/main/res/menu/reset_menu.xml | 12 +++++ app/src/main/res/values/strings.xml | 5 ++ 9 files changed, 169 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/drawable/ic_reset.xml create mode 100644 app/src/main/res/menu/reset_menu.xml diff --git a/app/src/main/java/org/mian/gitnex/adapters/MostVisitedReposAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MostVisitedReposAdapter.java index 23db498b..3f096fbf 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MostVisitedReposAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MostVisitedReposAdapter.java @@ -13,10 +13,14 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.mian.gitnex.R; import org.mian.gitnex.activities.RepoDetailActivity; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; @@ -27,8 +31,9 @@ import java.util.List; public class MostVisitedReposAdapter extends RecyclerView.Adapter { private List mostVisitedReposList; + private final Context ctx; - static class MostVisitedViewHolder extends RecyclerView.ViewHolder { + class MostVisitedViewHolder extends RecyclerView.ViewHolder { private Repository repository; @@ -36,6 +41,7 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter { @@ -53,10 +60,37 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter { + + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert); + + materialAlertDialogBuilder.setTitle(ctx.getString(R.string.reset)) + .setMessage(ctx.getString(R.string.resetCounterDialogMessage, repository.getRepositoryName())) + .setPositiveButton(R.string.reset, (dialog, whichButton) -> { + + int getRepositoryId = repository.getRepositoryId(); + resetRepositoryCounter(getBindingAdapterPosition()); + + RepositoriesApi repositoriesApi = BaseApi.getInstance(ctx, RepositoriesApi.class); + assert repositoriesApi != null; + repositoriesApi.updateRepositoryMostVisited(0, getRepositoryId); + }) + .setNeutralButton(R.string.cancelButton, null).show(); + }); } } - public MostVisitedReposAdapter(List reposListMain) { + private void resetRepositoryCounter(int position) { + + mostVisitedReposList.remove(position); + notifyItemRemoved(position); + notifyItemRangeChanged(position, mostVisitedReposList.size()); + Toasty.success(ctx, ctx.getResources().getString(R.string.resetMostReposCounter)); + } + + public MostVisitedReposAdapter(Context ctx, List reposListMain) { + this.ctx = ctx; this.mostVisitedReposList = reposListMain; } diff --git a/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java b/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java index b38ea2f9..f795fb9d 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/RepositoriesApi.java @@ -74,6 +74,10 @@ public class RepositoriesApi extends BaseApi { executorService.execute(() -> repositoriesDao.updateRepositoryMostVisited(mostVisited, repositoryId)); } + public void resetAllRepositoryMostVisited(int repoAccountId) { + executorService.execute(() -> repositoriesDao.resetAllRepositoryMostVisited(repoAccountId)); + } + public LiveData> fetchAllMostVisited(int repoAccountId) { return repositoriesDao.fetchAllMostVisited(repoAccountId); } diff --git a/app/src/main/java/org/mian/gitnex/database/dao/RepositoriesDao.java b/app/src/main/java/org/mian/gitnex/database/dao/RepositoriesDao.java index 2c6b2658..f8800343 100644 --- a/app/src/main/java/org/mian/gitnex/database/dao/RepositoriesDao.java +++ b/app/src/main/java/org/mian/gitnex/database/dao/RepositoriesDao.java @@ -49,4 +49,7 @@ public interface RepositoriesDao { @Query("SELECT * FROM Repositories WHERE mostVisited > 0 AND repoAccountId = :repoAccountId ORDER BY mostVisited DESC LIMIT 50") LiveData> fetchAllMostVisited(int repoAccountId); + + @Query("UPDATE Repositories SET mostVisited = 0 WHERE repoAccountId = :repoAccountId") + void resetAllRepositoryMostVisited(int repoAccountId); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java index bdd1879d..f6b4cdba 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MostVisitedReposFragment.java @@ -5,6 +5,9 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -13,6 +16,7 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.MostVisitedReposAdapter; @@ -21,8 +25,10 @@ import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.databinding.FragmentDraftsBinding; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.Toasty; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * @author M M Arif @@ -62,7 +68,7 @@ public class MostVisitedReposFragment extends Fragment { mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(ctx)); - adapter = new MostVisitedReposAdapter(mostVisitedReposList); + adapter = new MostVisitedReposAdapter(ctx, mostVisitedReposList); currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { @@ -95,4 +101,48 @@ public class MostVisitedReposFragment extends Fragment { } }); } + + public void resetAllRepositoryCounter(int accountId) { + + if(mostVisitedReposList.size() > 0) { + + Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class)).resetAllRepositoryMostVisited(accountId); + mostVisitedReposList.clear(); + adapter.notifyDataChanged(); + Toasty.success(ctx, getResources().getString(R.string.resetMostReposCounter)); + } + else { + Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); + } + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + + inflater.inflate(R.menu.reset_menu, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + if(item.getItemId() == R.id.reset_menu_item) { + + if (mostVisitedReposList.size() == 0) { + Toasty.warning(ctx, getResources().getString(R.string.noDataFound)); + } + else { + new MaterialAlertDialogBuilder(ctx) + .setTitle(R.string.reset) + .setMessage(R.string.resetCounterAllDialogMessage) + .setPositiveButton(R.string.reset, (dialog, which) -> { + + resetAllRepositoryCounter(currentActiveAccountId); + dialog.dismiss(); + }).setNeutralButton(R.string.cancelButton, null).show(); + } + } + + return super.onOptionsItemSelected(item); + } } diff --git a/app/src/main/res/drawable/ic_reset.xml b/app/src/main/res/drawable/ic_reset.xml new file mode 100644 index 00000000..5ef83cdc --- /dev/null +++ b/app/src/main/res/drawable/ic_reset.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/list_most_visited_repos.xml b/app/src/main/res/layout/list_most_visited_repos.xml index ceb0b83b..5aded3a1 100644 --- a/app/src/main/res/layout/list_most_visited_repos.xml +++ b/app/src/main/res/layout/list_most_visited_repos.xml @@ -66,12 +66,10 @@ android:layout_marginBottom="@dimen/dimen8dp" /> + android:orientation="horizontal"> + + + + + + diff --git a/app/src/main/res/layout/list_repositories.xml b/app/src/main/res/layout/list_repositories.xml index 2663db52..20b6ae14 100644 --- a/app/src/main/res/layout/list_repositories.xml +++ b/app/src/main/res/layout/list_repositories.xml @@ -34,7 +34,7 @@ android:id="@+id/orgInfoFrame" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="8dp" + android:layout_marginBottom="@dimen/dimen8dp" android:gravity="center_vertical" android:orientation="horizontal" tools:ignore="UseCompoundDrawables"> @@ -43,8 +43,8 @@ android:id="@+id/imageAvatar" android:layout_width="@dimen/dimen24dp" android:layout_height="@dimen/dimen24dp" - android:layout_marginStart="0dp" - android:layout_marginEnd="10dp" + android:layout_marginStart="@dimen/dimen0dp" + android:layout_marginEnd="@dimen/dimen10dp" android:contentDescription="@string/repoContentAvatar" android:src="@drawable/ic_android" /> @@ -53,7 +53,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="?attr/primaryTextColor" - android:textSize="14sp" + android:textSize="@dimen/dimen14sp" tools:text="@string/orgName" /> @@ -64,16 +64,16 @@ android:layout_height="wrap_content" android:text="@string/repoName" android:textColor="?attr/primaryTextColor" - android:textSize="18sp" + android:textSize="@dimen/dimen18sp" android:textStyle="bold" /> @@ -81,7 +81,7 @@ android:id="@+id/spacerView" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="8dp" /> + android:layout_marginBottom="@dimen/dimen8dp" /> + android:paddingStart="@dimen/dimen6dp" + android:paddingEnd="@dimen/dimen6dp"> @@ -122,14 +122,14 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:textColor="?attr/primaryTextColor" - android:textSize="14sp" + android:textSize="@dimen/dimen14sp" tools:text="@string/repoStars" /> diff --git a/app/src/main/res/menu/reset_menu.xml b/app/src/main/res/menu/reset_menu.xml new file mode 100644 index 00000000..21778bf2 --- /dev/null +++ b/app/src/main/res/menu/reset_menu.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e226f5c..33e11544 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -508,6 +508,7 @@ Reopen Open in Browser Delete %s + Reset Explore users @@ -616,6 +617,10 @@ This will delete all the drafts for this account. \n\nProceed with deletion? Draft was saved automatically. + Counter is reset successfully + Do you want to reset counter for repository %s? + This will reset all the counters for this account repositories. + Themes, fonts, badges Biometric authentication, SSL certificates, cache Languages