diff --git a/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationItemViewModel.java b/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationItemViewModel.java index dcac0ad..5193b29 100644 --- a/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationItemViewModel.java +++ b/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationItemViewModel.java @@ -1,12 +1,10 @@ package com.app.missednotificationsreminder.binding.model; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.net.Uri; import android.view.View; import com.app.missednotificationsreminder.binding.util.BindableBoolean; import com.app.missednotificationsreminder.binding.util.RxBindingUtils; +import com.app.missednotificationsreminder.data.model.ApplicationItem; import com.squareup.picasso.Picasso; import com.squareup.picasso.RequestCreator; @@ -17,16 +15,15 @@ * * @author Eugene Popovich */ -public class ApplicationItemViewModel extends BaseViewModel{ +public class ApplicationItemViewModel extends BaseViewModel { /** * Data binding field to store application checked state */ public BindableBoolean checked = new BindableBoolean(); + ApplicationItem mApplicationItem; private ApplicationCheckedStateChangedListener mApplicationCheckedStateChangedListener; - private PackageInfo mPackageInfo; private Picasso mPicasso; - private PackageManager mPackageManager; /** * @param checked the current application checked state @@ -37,15 +34,14 @@ public class ApplicationItemViewModel extends BaseViewModel{ * state changed event */ public ApplicationItemViewModel( - boolean checked, PackageInfo packageInfo, - PackageManager packageManager, Picasso picasso, + ApplicationItem applicationItem, + Picasso picasso, ApplicationCheckedStateChangedListener applicationCheckedStateChangedListener) { Timber.d("Constructor"); - mPackageInfo = packageInfo; - mPackageManager = packageManager; + mApplicationItem = applicationItem; mPicasso = picasso; mApplicationCheckedStateChangedListener = applicationCheckedStateChangedListener; - this.checked.set(checked); + this.checked.set(applicationItem.isChecked()); if (mApplicationCheckedStateChangedListener != null) { monitor(RxBindingUtils .valueChanged(this.checked) @@ -53,7 +49,7 @@ public ApplicationItemViewModel( .subscribe(value -> { Timber.d("Checked property changed for %1$s", toString()); mApplicationCheckedStateChangedListener.onApplicationCheckedStateChanged - (mPackageInfo, value); + (mApplicationItem, value); })); } } @@ -65,7 +61,7 @@ public ApplicationItemViewModel( */ public CharSequence getName() { Timber.d("getName for %1$s", toString()); - return mPackageInfo.applicationInfo.loadLabel(mPackageManager); + return mApplicationItem.getApplicationName(); } /** @@ -75,7 +71,7 @@ public CharSequence getName() { */ public String getDescription() { Timber.d("getDescription for %1$s", toString()); - return mPackageInfo.packageName; + return mApplicationItem.getPackageName(); } /** @@ -85,13 +81,8 @@ public String getDescription() { */ public RequestCreator getIcon() { Timber.d("getIcon for %1$s", toString()); - Uri result = null; - int icon = mPackageInfo.applicationInfo.icon; - if (icon != 0) { - result = Uri.parse("android.resource://" + mPackageInfo.packageName + "/" + icon); - } - return result == null ? null : mPicasso.load(result) - .fit(); + return mApplicationItem.hasIcon() ? mPicasso.load(mApplicationItem.getIconUri()) + .fit() : null; } /** @@ -107,13 +98,13 @@ public void onItemClicked(View v) { @Override public String toString() { - return String.format("%1$s(checked=%2$b, package=%3$s)", getClass().getSimpleName(), checked.get(), mPackageInfo.packageName); + return String.format("%1$s(checked=%2$b, package=%3$s)", getClass().getSimpleName(), checked.get(), mApplicationItem.getPackageName()); } /** * The interface subscribers to the onApplicationCheckedStateChanged event should implement */ public static interface ApplicationCheckedStateChangedListener { - void onApplicationCheckedStateChanged(PackageInfo packageInfo, boolean checked); + void onApplicationCheckedStateChanged(ApplicationItem applicationItem, boolean checked); } } diff --git a/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationsSelectionViewModel.java b/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationsSelectionViewModel.java index 2c5c677..f39e38d 100644 --- a/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationsSelectionViewModel.java +++ b/app/src/main/java/com/app/missednotificationsreminder/binding/model/ApplicationsSelectionViewModel.java @@ -38,13 +38,14 @@ public class ApplicationsSelectionViewModel extends BaseViewModel { private PublishSubject> dataLoadSubject; /** - * @param view the related view + * @param view the related view * @param selectedApplications preference to store/retrieve selected applications * @param mainThreadScheduler * @param ioThreadScheduler * @param packageManager */ - @Inject public ApplicationsSelectionViewModel(ApplicationsSelectionView view, @SelectedApplications Preference> selectedApplications, @MainThreadScheduler Scheduler mainThreadScheduler, + @Inject public ApplicationsSelectionViewModel(ApplicationsSelectionView view, @SelectedApplications Preference> selectedApplications, + @MainThreadScheduler Scheduler mainThreadScheduler, @IoThreadScheduler Scheduler ioThreadScheduler, PackageManager packageManager) { this.mMainThreadScheduler = mainThreadScheduler; @@ -62,7 +63,6 @@ private void init() { Observable> result = dataLoadSubject // .flatMap(packagesList) // load data - .subscribeOn(mIoThreadScheduler) .observeOn(mMainThreadScheduler) // .share(); monitor(result // @@ -82,15 +82,15 @@ public void loadData() { * checked/unchecked state information */ private final Func1, Observable>> packagesList = - selectedPreferences -> { + selectedPreferences -> Observable.fromCallable(() -> { List result = new ArrayList<>(); List packages = mPackageManager.getInstalledPackages(0); for (PackageInfo packageInfo : packages) { boolean selected = selectedPreferences.contains(packageInfo.packageName); - result.add(new ApplicationItem(selected, packageInfo)); + result.add(new ApplicationItem(selected, packageInfo, mPackageManager)); } - return Observable.just(result); - }; + return result; + }).subscribeOn(mIoThreadScheduler); /** diff --git a/app/src/main/java/com/app/missednotificationsreminder/data/model/ApplicationItem.java b/app/src/main/java/com/app/missednotificationsreminder/data/model/ApplicationItem.java index b3054d7..e7a65d8 100644 --- a/app/src/main/java/com/app/missednotificationsreminder/data/model/ApplicationItem.java +++ b/app/src/main/java/com/app/missednotificationsreminder/data/model/ApplicationItem.java @@ -1,6 +1,8 @@ package com.app.missednotificationsreminder.data.model; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; import com.app.missednotificationsreminder.binding.model.ApplicationsSelectionViewModel; @@ -11,17 +13,25 @@ */ public class ApplicationItem { private boolean mChecked; - private PackageInfo mPpackageInfo; + private CharSequence mApplicationName; + private String mPackageName; + private Uri mIconUri; /** * Creates the ApplicationItem object * - * @param checked whether the application is already checked by user - * @param ppackageInfo the application package information + * @param checked whether the application is already checked by user + * @param packageInfo the application package information + * @param packageManager the package manager instance */ - public ApplicationItem(boolean checked, PackageInfo ppackageInfo) { + public ApplicationItem(boolean checked, PackageInfo packageInfo, PackageManager packageManager) { mChecked = checked; - mPpackageInfo = ppackageInfo; + mApplicationName = packageInfo.applicationInfo.loadLabel(packageManager); + mPackageName = packageInfo.packageName; + int icon = packageInfo.applicationInfo.icon; + if (icon != 0) { + mIconUri = Uri.parse("android.resource://" + packageInfo.packageName + "/" + icon); + } } public boolean isChecked() { @@ -32,11 +42,19 @@ public void setChecked(boolean checked) { mChecked = checked; } - public PackageInfo getPpackageInfo() { - return mPpackageInfo; + public CharSequence getApplicationName() { + return mApplicationName; } - public void setPpackageInfo(PackageInfo ppackageInfo) { - mPpackageInfo = ppackageInfo; + public String getPackageName() { + return mPackageName; + } + + public boolean hasIcon() { + return mIconUri != null; + } + + public Uri getIconUri() { + return mIconUri; } } diff --git a/app/src/main/java/com/app/missednotificationsreminder/ui/activity/ApplicationsSelectionActivityModule.java b/app/src/main/java/com/app/missednotificationsreminder/ui/activity/ApplicationsSelectionActivityModule.java index e1b1c32..95becfa 100644 --- a/app/src/main/java/com/app/missednotificationsreminder/ui/activity/ApplicationsSelectionActivityModule.java +++ b/app/src/main/java/com/app/missednotificationsreminder/ui/activity/ApplicationsSelectionActivityModule.java @@ -46,10 +46,10 @@ public final class ApplicationsSelectionActivityModule { @Provides @Singleton ApplicationItemViewModel.ApplicationCheckedStateChangedListener provideApplicationsCheckedStateChangeListener(@SelectedApplications Preference> selectedApplications) { - return (packageInfo, checked) -> { - Timber.d("Update selected application value %1$s to %2$b", packageInfo.packageName, checked); + return (applicationItem, checked) -> { + Timber.d("Update selected application value %1$s to %2$b", applicationItem.getPackageName(), checked); Observable>> selection = Observable - .just(new Pair<>(packageInfo.packageName, selectedApplications.get())) + .just(new Pair<>(applicationItem.getPackageName(), selectedApplications.get())) .share(); // for sure we may use if condition here instead of concatenation of 2 observables. Just wanted to achieve // same result with RxJava usage. diff --git a/app/src/main/java/com/app/missednotificationsreminder/ui/widget/ApplicationsSelectionAdapter.java b/app/src/main/java/com/app/missednotificationsreminder/ui/widget/ApplicationsSelectionAdapter.java index 32cd1f9..870abff 100644 --- a/app/src/main/java/com/app/missednotificationsreminder/ui/widget/ApplicationsSelectionAdapter.java +++ b/app/src/main/java/com/app/missednotificationsreminder/ui/widget/ApplicationsSelectionAdapter.java @@ -45,7 +45,7 @@ public int compare(ApplicationItem t0, ApplicationItem t1) { } String getLabel(ApplicationItem item){ - CharSequence result = item.getPpackageInfo().applicationInfo.loadLabel(mPackageManager); + CharSequence result = item.getApplicationName(); if(result == null){ result = ""; } @@ -60,7 +60,7 @@ public boolean areContentsTheSame(ApplicationItem oldItem, @Override public boolean areItemsTheSame(ApplicationItem item1, ApplicationItem item2) { - return item1.getPpackageInfo() == item2.getPpackageInfo(); + return item1 == item2; } }); @@ -117,7 +117,7 @@ public ViewHolder(ApplicationSelectableItemViewBinding binding) { public void bindTo(final ApplicationItem item) { binding.setModel( - new ApplicationItemViewModel(item.isChecked(), item.getPpackageInfo(), mPackageManager, + new ApplicationItemViewModel(item, mPicasso, (packageInfo, checked) -> { Timber.d("Update checked value to %1$b", checked);