diff --git a/app/src/main/java/com/aurora/store/Constants.java b/app/src/main/java/com/aurora/store/Constants.java index dc67eaa68..8f0af051a 100644 --- a/app/src/main/java/com/aurora/store/Constants.java +++ b/app/src/main/java/com/aurora/store/Constants.java @@ -56,7 +56,7 @@ public class Constants { public static final String PREFERENCE_DEVICE_TO_PRETEND_TO_BE = "PREFERENCE_DEVICE_TO_PRETEND_TO_BE"; public static final String PREFERENCE_DEVICE_TO_PRETEND_TO_BE_INDEX = "PREFERENCE_DEVICE_TO_PRETEND_TO_BE_INDEX"; public static final String PREFERENCE_REQUESTED_LOCATION_INDEX = "PREFERENCE_REQUESTED_LOCATION_INDEX"; - public static final String PREFERENCE_BLACKLIST_APPS_SET = "PREFERENCE_BLACKLIST_APPS_SET"; + public static final String PREFERENCE_BLACKLIST_APPS_LIST = "PREFERENCE_BLACKLIST_APPS_LIST"; public static final String PREFERENCE_FILTER_GOOGLE = "PREFERENCE_FILTER_GOOGLE"; public static final String PREFERENCE_FILTER_F_DROID = "PREFERENCE_FILTER_F_DROID"; public static final String PREFERENCE_FILTER_SEARCH = "PREFERENCE_FILTER_SEARCH"; diff --git a/app/src/main/java/com/aurora/store/adapter/AppMenuAdapter.java b/app/src/main/java/com/aurora/store/adapter/AppMenuAdapter.java index 50246d04b..4a592943d 100644 --- a/app/src/main/java/com/aurora/store/adapter/AppMenuAdapter.java +++ b/app/src/main/java/com/aurora/store/adapter/AppMenuAdapter.java @@ -114,11 +114,11 @@ public class AppMenuAdapter extends RecyclerView.Adapter { - blacklistManager.removeFromBlacklist(app.getPackageName()); + blacklistManager.remove(app.getPackageName()); menuSheet.dismissAllowingStateLoss(); Toast.makeText(context, context.getString(R.string.toast_apk_whitelisted), Toast.LENGTH_SHORT).show(); @@ -126,7 +126,7 @@ public class AppMenuAdapter extends RecyclerView.Adapter { - blacklistManager.addToBlacklist(app.getPackageName()); + blacklistManager.add(app.getPackageName()); menuSheet.dismissAllowingStateLoss(); Toast.makeText(context, context.getString(R.string.toast_apk_blacklisted), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/aurora/store/adapter/BlacklistAdapter.java b/app/src/main/java/com/aurora/store/adapter/BlacklistAdapter.java index aecede371..82429d33b 100644 --- a/app/src/main/java/com/aurora/store/adapter/BlacklistAdapter.java +++ b/app/src/main/java/com/aurora/store/adapter/BlacklistAdapter.java @@ -21,8 +21,6 @@ package com.aurora.store.adapter; import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,15 +30,14 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import com.aurora.store.GlideApp; import com.aurora.store.R; -import com.aurora.store.model.Packages; +import com.aurora.store.model.App; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import butterknife.BindView; import butterknife.ButterKnife; @@ -48,29 +45,13 @@ import butterknife.ButterKnife; public class BlacklistAdapter extends SelectableAdapter { - private List packagesList; + private List appList = new ArrayList<>(); private ItemClickListener itemClickListener; - public BlacklistAdapter(Context context, List resolveInfos, ItemClickListener itemClickListener) { + public BlacklistAdapter(Context context, List appList, ItemClickListener itemClickListener) { super(context); this.itemClickListener = itemClickListener; - - PackageManager mPackageManager = context.getPackageManager(); - Set mBlackListSet = new HashSet<>(); - mBlackListSet.add("com.aurora.store"); - mBlackListSet.add("com.google.android.gms"); - mBlackListSet.add("Services Framework Proxy"); - mBlackListSet.add("com.android.vending"); - mBlackListSet.add(""); - - packagesList = new ArrayList<>(); - for (int i = 0; i < resolveInfos.size(); i++) { - ResolveInfo mResolveInfo = resolveInfos.get(i); - String mPackageName = mResolveInfo.activityInfo.packageName; - if (!mBlackListSet.contains(mPackageName)) { - packagesList.add(new Packages(mResolveInfo, mPackageName, mPackageManager)); - } - } + this.appList = appList; } @NotNull @@ -82,27 +63,36 @@ public class BlacklistAdapter extends SelectableAdapter extends RecyclerView.Adapter { - protected Set mSelections; + protected ArrayList mSelections; protected Context context; - private BlacklistManager mBlacklistManager; + protected BlacklistManager mBlacklistManager; SelectableAdapter(Context context) { this.context = context; mBlacklistManager = new BlacklistManager(context); - Set blacklistedApps = mBlacklistManager.getBlacklistedApps(); - mSelections = new HashSet<>(); - + ArrayList blacklistedApps = mBlacklistManager.get(); + mSelections = new ArrayList<>(); if (blacklistedApps != null && !blacklistedApps.isEmpty()) { mSelections.addAll(blacklistedApps); } @@ -54,14 +52,11 @@ abstract class SelectableAdapter extends Rec } public void addSelectionsToBlackList() { - mBlacklistManager.addSelectionsToBlackList(mSelections); + mBlacklistManager.addAll(mSelections); } - public void removeSelectionsToBlackList() { - Set blacklistedApps = mBlacklistManager.getBlacklistedApps(); - if (blacklistedApps != null && !blacklistedApps.isEmpty()) { - mSelections.removeAll(blacklistedApps); - } - mBlacklistManager.removeSelectionsFromBlackList(mSelections); + public void removeSelectionsFromBlackList() { + mBlacklistManager.removeAll(mSelections); + mSelections = new ArrayList<>(); } } diff --git a/app/src/main/java/com/aurora/store/fragment/BaseFragment.java b/app/src/main/java/com/aurora/store/fragment/BaseFragment.java index c6390f1ff..91f469f4e 100644 --- a/app/src/main/java/com/aurora/store/fragment/BaseFragment.java +++ b/app/src/main/java/com/aurora/store/fragment/BaseFragment.java @@ -41,7 +41,6 @@ import java.net.UnknownHostException; import io.reactivex.Flowable; import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; @@ -128,7 +127,7 @@ public abstract class BaseFragment extends Fragment { mDisposable.add(Flowable.fromCallable(() -> new PlayStoreApiAuthenticator(context).refreshToken()) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.computation()) .subscribe((success) -> { if (success) { Log.i("Token Refreshed"); @@ -141,7 +140,6 @@ public abstract class BaseFragment extends Fragment { Log.e("Token Refresh Login failed %s", err.getMessage()); eventListenerImpl.onLoginFailed(); })); - mDisposable.dispose(); } public interface EventListenerImpl { diff --git a/app/src/main/java/com/aurora/store/fragment/BlacklistFragment.java b/app/src/main/java/com/aurora/store/fragment/BlacklistFragment.java index ef139e7a7..daf7b38a0 100644 --- a/app/src/main/java/com/aurora/store/fragment/BlacklistFragment.java +++ b/app/src/main/java/com/aurora/store/fragment/BlacklistFragment.java @@ -21,37 +21,50 @@ package com.aurora.store.fragment; import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.ViewSwitcher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.aurora.store.manager.BlacklistManager; +import com.aurora.store.ErrorType; import com.aurora.store.R; import com.aurora.store.adapter.BlacklistAdapter; +import com.aurora.store.model.App; +import com.aurora.store.task.InstalledApps; +import com.aurora.store.utility.Log; +import com.aurora.store.utility.ViewUtil; +import com.aurora.store.view.CustomSwipeToRefresh; +import com.aurora.store.view.ErrorView; -import java.util.Collections; import java.util.List; -import java.util.Set; import butterknife.BindView; import butterknife.ButterKnife; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; -public class BlacklistFragment extends Fragment implements BlacklistAdapter.ItemClickListener { +public class BlacklistFragment extends BaseFragment implements BlacklistAdapter.ItemClickListener, BaseFragment.EventListenerImpl { - @BindView(R.id.recycler_view) + @BindView(R.id.view_switcher) + ViewSwitcher mViewSwitcher; + @BindView(R.id.content_view) + LinearLayout layoutContent; + @BindView(R.id.err_view) + LinearLayout layoutError; + @BindView(R.id.swipe_layout) + CustomSwipeToRefresh customSwipeToRefresh; + @BindView(R.id.recycler) RecyclerView mRecyclerView; @BindView(R.id.btn_clear_all) Button btnClearAll; @@ -59,7 +72,6 @@ public class BlacklistFragment extends Fragment implements BlacklistAdapter.Item TextView txtBlacklist; private Context context; - private BlacklistManager mBlacklistManager; private BlacklistAdapter mAdapter; @Override @@ -79,29 +91,75 @@ public class BlacklistFragment extends Fragment implements BlacklistAdapter.Item @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mBlacklistManager = new BlacklistManager(context); - setupRecycler(); + setErrorView(ErrorType.UNKNOWN); + loadAllApps(); setupClearAll(); } + @Override + public void onResume() { + super.onResume(); + } + private void updateBlackListedApps() { mAdapter.addSelectionsToBlackList(); } private void clearBlackListedApps() { if (mAdapter != null) { - mAdapter.removeSelectionsToBlackList(); + mAdapter.removeSelectionsFromBlackList(); mAdapter.notifyDataSetChanged(); txtBlacklist.setText(getString(R.string.list_blacklist_none)); } } - private void setupRecycler() { - List mInstalledPackages = getInstalledApps(); - mAdapter = new BlacklistAdapter(context, mInstalledPackages, this); + private void loadAllApps() { + InstalledApps mTaskHelper = new InstalledApps(context); + mDisposable.add(Observable.fromCallable(() -> mTaskHelper.getInstalledApps(false)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSubscribe(subscription -> customSwipeToRefresh.setRefreshing(true)) + .subscribe((appList) -> { + if (appList.isEmpty()) { + setErrorView(ErrorType.NO_APPS); + switchViews(true); + } else { + switchViews(false); + setupRecycler(appList); + } + }, err -> { + Log.e(err.getMessage()); + processException(err); + })); + } + + private void setupRecycler(List appList) { + customSwipeToRefresh.setRefreshing(false); + mAdapter = new BlacklistAdapter(context, appList, this); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false)); mRecyclerView.setAdapter(mAdapter); + updateCount(); + } + + private void setErrorView(ErrorType errorType) { + layoutError.removeAllViews(); + layoutError.addView(new ErrorView(context, errorType, retry())); + } + + private View.OnClickListener retry() { + return v -> { + loadAllApps(); + ((Button) v).setText(getString(R.string.action_retry_ing)); + ((Button) v).setEnabled(false); + }; + } + + private void switchViews(boolean showError) { + if (mViewSwitcher.getCurrentView() == layoutContent && showError) + mViewSwitcher.showNext(); + else if (mViewSwitcher.getCurrentView() == layoutError && !showError) + mViewSwitcher.showPrevious(); } private void setupClearAll() { @@ -110,24 +168,37 @@ public class BlacklistFragment extends Fragment implements BlacklistAdapter.Item }); } + private void updateCount() { + int count = mAdapter.getSelectedCount(); + String txtCount = new StringBuilder() + .append(getResources().getString(R.string.list_blacklist)) + .append(" : ") + .append(count).toString(); + txtBlacklist.setText(count > 0 ? txtCount : getString(R.string.list_blacklist_none)); + ViewUtil.setVisibility(btnClearAll, count > 0, true); + } + @Override public void onItemClicked(int position) { mAdapter.toggleSelection(position); updateBlackListedApps(); - int count = mBlacklistManager.getBlacklistedApps().size(); - String txtCount = new StringBuilder() - .append(getResources().getString(R.string.list_blacklist)) - .append(" : ") - .append(mBlacklistManager.getBlacklistedApps().size()).toString(); - txtBlacklist.setText(count > 0 ? txtCount : getString(R.string.list_blacklist_none)); + updateCount(); } - private List getInstalledApps() { - PackageManager packageManager = context.getPackageManager(); - Intent intent = new Intent(Intent.ACTION_MAIN, null); - intent.addCategory(Intent.CATEGORY_LAUNCHER); - List installedApps = packageManager.queryIntentActivities(intent, PackageManager.GET_META_DATA); - Collections.sort(installedApps, new ResolveInfo.DisplayNameComparator(packageManager)); - return installedApps; + @Override + public void onLoggedIn() { + loadAllApps(); + } + + @Override + public void onLoginFailed() { + setErrorView(ErrorType.UNKNOWN); + switchViews(true); + } + + @Override + public void onNetworkFailed() { + setErrorView(ErrorType.NO_NETWORK); + switchViews(true); } } diff --git a/app/src/main/java/com/aurora/store/manager/BlacklistManager.java b/app/src/main/java/com/aurora/store/manager/BlacklistManager.java index b2c1873e7..f9363ee83 100644 --- a/app/src/main/java/com/aurora/store/manager/BlacklistManager.java +++ b/app/src/main/java/com/aurora/store/manager/BlacklistManager.java @@ -25,50 +25,59 @@ import android.content.Context; import com.aurora.store.Constants; import com.aurora.store.utility.PrefUtil; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class BlacklistManager { private Context context; + private ArrayList blackList; public BlacklistManager(Context context) { this.context = context; + blackList = PrefUtil.getListString(context, Constants.PREFERENCE_BLACKLIST_APPS_LIST); } - public Set getBlacklistedApps() { - return PrefUtil.getStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET); + public boolean add(String s) { + ArrayList arrayList = new ArrayList<>(); + arrayList.add(s); + boolean result = addAll(arrayList); + save(); + return result; } - public boolean isBackListed(String packageName){ - Set hiddenApps = PrefUtil.getStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET); - return hiddenApps.contains(packageName); + public boolean addAll(ArrayList arrayList) { + boolean result = blackList.addAll(arrayList); + Set mAppSet = new HashSet<>(blackList); + blackList.clear(); + blackList.addAll(mAppSet); + save(); + return result; } - public void addToBlacklist(String packageName) { - Set hiddenApps = PrefUtil.getStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET); - hiddenApps.add(packageName); - PrefUtil.putStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET, hiddenApps); + public ArrayList get() { + return blackList; } - public void removeFromBlacklist(String packageName) { - Set hiddenApps = PrefUtil.getStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET); - if (hiddenApps != null && !hiddenApps.isEmpty()) { - hiddenApps.remove(packageName); - } - PrefUtil.putStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET, hiddenApps); + public boolean contains(String packageName) { + return blackList.contains(packageName); } - public void addSelectionsToBlackList(Set set) { - PrefUtil.putStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET, set); + public boolean remove(String packageName) { + boolean result = blackList.remove(packageName); + save(); + return result; } - public void removeSelectionsFromBlackList(Set set) { - Set hiddenApps = PrefUtil.getStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET); - if (hiddenApps != null && !hiddenApps.isEmpty()) { - set.removeAll(hiddenApps); - } - PrefUtil.putStringSet(context, Constants.PREFERENCE_BLACKLIST_APPS_SET, set); + public boolean removeAll(ArrayList packageList) { + boolean result = blackList.removeAll(packageList); + save(); + return result; + } + + private void save() { + PrefUtil.putListString(context, Constants.PREFERENCE_BLACKLIST_APPS_LIST, blackList); } public Set getGoogleApps() { diff --git a/app/src/main/java/com/aurora/store/model/Packages.java b/app/src/main/java/com/aurora/store/model/Packages.java deleted file mode 100644 index e33b39195..000000000 --- a/app/src/main/java/com/aurora/store/model/Packages.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2019, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - * - */ - -package com.aurora.store.model; - -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.graphics.drawable.Drawable; - -public class Packages { - private String packageName; - private CharSequence label; - private Drawable icon; - - public Packages(ResolveInfo info, String packageName, PackageManager packageManager) { - this.packageName = packageName; - label = info.loadLabel(packageManager); - icon = info.loadIcon(packageManager); - } - - public String getPackageName() { - return packageName; - } - - public CharSequence getLabel() { - return label; - } - - public Drawable getIcon() { - return icon; - } -} diff --git a/app/src/main/java/com/aurora/store/task/UpdatableApps.java b/app/src/main/java/com/aurora/store/task/UpdatableApps.java index c2a4d242d..5e5a2436a 100644 --- a/app/src/main/java/com/aurora/store/task/UpdatableApps.java +++ b/app/src/main/java/com/aurora/store/task/UpdatableApps.java @@ -103,7 +103,7 @@ public class UpdatableApps extends AllApps { private Map filterBlacklistedApps(Map apps) { Set packageNames = new HashSet<>(apps.keySet()); - packageNames.removeAll(new BlacklistManager(context).getBlacklistedApps()); + packageNames.removeAll(new BlacklistManager(context).get()); Map result = new HashMap<>(); for (App app : apps.values()) { if (packageNames.contains(app.getPackageName())) { diff --git a/app/src/main/java/com/aurora/store/utility/ViewUtil.java b/app/src/main/java/com/aurora/store/utility/ViewUtil.java index fbe8ed5f4..4bed30d61 100644 --- a/app/src/main/java/com/aurora/store/utility/ViewUtil.java +++ b/app/src/main/java/com/aurora/store/utility/ViewUtil.java @@ -133,6 +133,13 @@ public class ViewUtil { hideWithAnimation(view); } + public static void setVisibility(View view, boolean visibility, boolean noAnim) { + if (noAnim) + view.setVisibility(visibility ? View.VISIBLE : View.INVISIBLE); + else + setVisibility(view, visibility); + } + public static List parseMenu(Context context, @MenuRes int menuRes) { List menuEntryList = new ArrayList<>(); PopupMenu p = new PopupMenu(context, null); diff --git a/app/src/main/res/layout/fragment_blacklist.xml b/app/src/main/res/layout/fragment_blacklist.xml index 194e796b8..f8cf7bf29 100644 --- a/app/src/main/res/layout/fragment_blacklist.xml +++ b/app/src/main/res/layout/fragment_blacklist.xml @@ -23,47 +23,67 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_height="wrap_content"> - + android:layout_height="match_parent" + android:orientation="vertical"> - + android:minHeight="?actionBarSize"> - + - + - + + + + + + + + - + android:layout_height="match_parent" + android:orientation="vertical" /> + + diff --git a/app/src/main/res/layout/item_blacklist.xml b/app/src/main/res/layout/item_blacklist.xml index def76d728..5fa879d5f 100644 --- a/app/src/main/res/layout/item_blacklist.xml +++ b/app/src/main/res/layout/item_blacklist.xml @@ -38,7 +38,6 @@ android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_centerVertical="true" android:layout_toStartOf="@id/check" android:layout_toEndOf="@+id/icon" android:ellipsize="end" @@ -47,6 +46,20 @@ android:textColor="?android:attr/textColorPrimary" android:textSize="18sp" /> + +