diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppBlacklistActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppBlacklistActivity.java index ceba94ff..bf463268 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppBlacklistActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AppBlacklistActivity.java @@ -22,36 +22,28 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.support.v4.content.LocalBroadcastManager; -import android.view.LayoutInflater; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.Comparator; import java.util.IdentityHashMap; -import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.adapter.AppBlacklistAdapter; public class AppBlacklistActivity extends GBActivity { private static final Logger LOG = LoggerFactory.getLogger(AppBlacklistActivity.class); + private AppBlacklistAdapter appBlacklistAdapter; + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -68,77 +60,15 @@ public class AppBlacklistActivity extends GBActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_appblacklist); + RecyclerView appListView = (RecyclerView) findViewById(R.id.appListView); + appListView.setLayoutManager(new LinearLayoutManager(this)); - final PackageManager pm = getPackageManager(); + appBlacklistAdapter = new AppBlacklistAdapter(R.layout.item_with_checkbox, this); - final List packageList = pm.getInstalledApplications(PackageManager.GET_META_DATA); - ListView appListView = (ListView) findViewById(R.id.appListView); - - // sort the package list by label and blacklist status - nameMap = new IdentityHashMap<>(packageList.size()); - for (ApplicationInfo ai : packageList) { - CharSequence name = pm.getApplicationLabel(ai); - if (name == null) { - name = ai.packageName; - } - if (GBApplication.blacklist.contains(ai.packageName)) { - // sort blacklisted first by prefixing with a '!' - name = "!" + name; - } - nameMap.put(ai, name.toString()); - } - - Collections.sort(packageList, new Comparator() { - @Override - public int compare(ApplicationInfo ai1, ApplicationInfo ai2) { - final String s1 = nameMap.get(ai1); - final String s2 = nameMap.get(ai2); - return s1.compareTo(s2); - } - }); - - final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item_with_checkbox, packageList) { - @Override - public View getView(int position, View view, ViewGroup parent) { - if (view == null) { - LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = inflater.inflate(R.layout.item_with_checkbox, parent, false); - } - - ApplicationInfo appInfo = packageList.get(position); - TextView deviceAppVersionAuthorLabel = (TextView) view.findViewById(R.id.item_details); - TextView deviceAppNameLabel = (TextView) view.findViewById(R.id.item_name); - ImageView deviceImageView = (ImageView) view.findViewById(R.id.item_image); - CheckBox checkbox = (CheckBox) view.findViewById(R.id.item_checkbox); - - deviceAppVersionAuthorLabel.setText(appInfo.packageName); - deviceAppNameLabel.setText(nameMap.get(appInfo)); - deviceImageView.setImageDrawable(appInfo.loadIcon(pm)); - - checkbox.setChecked(GBApplication.blacklist.contains(appInfo.packageName)); - - return view; - } - }; - appListView.setAdapter(adapter); - - appListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View v, int position, long id) { - String packageName = packageList.get(position).packageName; - CheckBox checkBox = ((CheckBox) v.findViewById(R.id.item_checkbox)); - checkBox.toggle(); - if (checkBox.isChecked()) { - GBApplication.addToBlacklist(packageName); - } else { - GBApplication.removeFromBlacklist(packageName); - } - } - }); + appListView.setAdapter(appBlacklistAdapter); IntentFilter filter = new IntentFilter(); filter.addAction(GBApplication.ACTION_QUIT); - LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AppBlacklistAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AppBlacklistAdapter.java new file mode 100644 index 00000000..813e1e32 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/AppBlacklistAdapter.java @@ -0,0 +1,117 @@ +package nodomain.freeyourgadget.gadgetbridge.adapter; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.Collections; +import java.util.Comparator; +import java.util.IdentityHashMap; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; + +public class AppBlacklistAdapter extends RecyclerView.Adapter { + + private final List applicationInfoList; + private final int mLayoutId; + private final Context mContext; + private final PackageManager mPm; + private final IdentityHashMap mNameMap; + + + public AppBlacklistAdapter(int layoutId, Context context) { + mLayoutId = layoutId; + mContext = context; + mPm = context.getPackageManager(); + + applicationInfoList = mPm.getInstalledApplications(PackageManager.GET_META_DATA); + + // sort the package list by label and blacklist status + mNameMap = new IdentityHashMap(applicationInfoList.size()); + for (ApplicationInfo ai : applicationInfoList) { + CharSequence name = mPm.getApplicationLabel(ai); + if (name == null) { + name = ai.packageName; + } + if (GBApplication.blacklist.contains(ai.packageName)) { + // sort blacklisted first by prefixing with a '!' + name = "!" + name; + } + mNameMap.put(ai, name.toString()); + } + + Collections.sort(applicationInfoList, new Comparator() { + @Override + public int compare(ApplicationInfo ai1, ApplicationInfo ai2) { + final String s1 = mNameMap.get(ai1); + final String s2 = mNameMap.get(ai2); + return s1.compareTo(s2); + } + }); + + } + + @Override + public AppBlacklistAdapter.AppBLViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(mContext).inflate(mLayoutId, parent, false); + return new AppBLViewHolder(view); + } + + @Override + public void onBindViewHolder(AppBlacklistAdapter.AppBLViewHolder holder, int position) { + final ApplicationInfo appInfo = applicationInfoList.get(position); + + holder.deviceAppVersionAuthorLabel.setText(appInfo.packageName); + holder.deviceAppNameLabel.setText(mNameMap.get(appInfo)); + holder.deviceImageView.setImageDrawable(appInfo.loadIcon(mPm)); + + holder.checkbox.setChecked(GBApplication.blacklist.contains(appInfo.packageName)); + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CheckBox checkBox = ((CheckBox) v.findViewById(R.id.item_checkbox)); + checkBox.toggle(); + if (checkBox.isChecked()) { + GBApplication.addToBlacklist(appInfo.packageName); + } else { + GBApplication.removeFromBlacklist(appInfo.packageName); + } + } + }); + + } + + @Override + public int getItemCount() { + return applicationInfoList.size(); + } + + public class AppBLViewHolder extends RecyclerView.ViewHolder { + + final CheckBox checkbox; + final ImageView deviceImageView; + final TextView deviceAppVersionAuthorLabel; + final TextView deviceAppNameLabel; + + AppBLViewHolder(View itemView) { + super(itemView); + + checkbox = (CheckBox) itemView.findViewById(R.id.item_checkbox); + deviceImageView = (ImageView) itemView.findViewById(R.id.item_image); + deviceAppVersionAuthorLabel = (TextView) itemView.findViewById(R.id.item_details); + deviceAppNameLabel = (TextView) itemView.findViewById(R.id.item_name); + } + + } + +} diff --git a/app/src/main/res/layout/activity_appblacklist.xml b/app/src/main/res/layout/activity_appblacklist.xml index 5ad2fbef..08f0445b 100644 --- a/app/src/main/res/layout/activity_appblacklist.xml +++ b/app/src/main/res/layout/activity_appblacklist.xml @@ -2,17 +2,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" - android:paddingTop="@dimen/activity_vertical_margin" - android:paddingBottom="@dimen/activity_vertical_margin" tools:context="nodomain.freeyourgadget.gadgetbridge.activities.AppBlacklistActivity"> - + android:layout_centerHorizontal="true" + android:divider="@null" /> diff --git a/app/src/main/res/layout/item_with_checkbox.xml b/app/src/main/res/layout/item_with_checkbox.xml index c166b0aa..45ffc8ff 100644 --- a/app/src/main/res/layout/item_with_checkbox.xml +++ b/app/src/main/res/layout/item_with_checkbox.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/activatedBackgroundIndicator" - android:padding="8dp"> + android:minHeight="60dp"> @@ -19,7 +21,12 @@ android:id="@+id/item_image" android:layout_width="48dp" android:layout_height="48dp" - android:layout_toRightOf="@+id/item_checkbox" /> + android:layout_centerVertical="true" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:layout_toEndOf="@+id/item_checkbox" + android:paddingBottom="8dp" + android:paddingTop="8dp" /> + android:padding="8dp">