mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-03 17:02:13 +01:00
Implement recyclerView in the AppBlackListActivity.
This allows to implement a search functionality (in the future)
This commit is contained in:
parent
16cff936d3
commit
48728cbb50
@ -22,36 +22,28 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.NavUtils;
|
import android.support.v4.app.NavUtils;
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
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.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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.adapter.AppBlacklistAdapter;
|
||||||
|
|
||||||
|
|
||||||
public class AppBlacklistActivity extends GBActivity {
|
public class AppBlacklistActivity extends GBActivity {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(AppBlacklistActivity.class);
|
private static final Logger LOG = LoggerFactory.getLogger(AppBlacklistActivity.class);
|
||||||
|
|
||||||
|
private AppBlacklistAdapter appBlacklistAdapter;
|
||||||
|
|
||||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@ -68,77 +60,15 @@ public class AppBlacklistActivity extends GBActivity {
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_appblacklist);
|
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<ApplicationInfo> packageList = pm.getInstalledApplications(PackageManager.GET_META_DATA);
|
appListView.setAdapter(appBlacklistAdapter);
|
||||||
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<ApplicationInfo>() {
|
|
||||||
@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<ApplicationInfo> adapter = new ArrayAdapter<ApplicationInfo>(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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter();
|
IntentFilter filter = new IntentFilter();
|
||||||
filter.addAction(GBApplication.ACTION_QUIT);
|
filter.addAction(GBApplication.ACTION_QUIT);
|
||||||
|
|
||||||
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
|
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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<AppBlacklistAdapter.AppBLViewHolder> {
|
||||||
|
|
||||||
|
private final List<ApplicationInfo> applicationInfoList;
|
||||||
|
private final int mLayoutId;
|
||||||
|
private final Context mContext;
|
||||||
|
private final PackageManager mPm;
|
||||||
|
private final IdentityHashMap<ApplicationInfo, String> 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<ApplicationInfo, String>(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<ApplicationInfo>() {
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,17 +2,14 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="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">
|
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.AppBlacklistActivity">
|
||||||
|
|
||||||
<ListView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/appListView"
|
android:id="@+id/appListView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
android:layout_centerHorizontal="true" />
|
android:layout_centerHorizontal="true"
|
||||||
|
android:divider="@null" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?android:attr/activatedBackgroundIndicator"
|
android:background="?android:attr/activatedBackgroundIndicator"
|
||||||
android:padding="8dp">
|
android:minHeight="60dp">
|
||||||
|
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
@ -12,6 +12,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
android:clickable="false"
|
android:clickable="false"
|
||||||
android:focusable="false" />
|
android:focusable="false" />
|
||||||
|
|
||||||
@ -19,7 +21,12 @@
|
|||||||
android:id="@+id/item_image"
|
android:id="@+id/item_image"
|
||||||
android:layout_width="48dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="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" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
@ -27,21 +34,20 @@
|
|||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_toEndOf="@+id/item_image"
|
android:layout_toEndOf="@+id/item_image"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingEnd="8dp"
|
android:padding="8dp">
|
||||||
android:paddingStart="8dp">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/item_name"
|
android:id="@+id/item_name"
|
||||||
style="@style/Base.TextAppearance.AppCompat.SearchResult.Title"
|
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:scrollHorizontally="false"
|
android:scrollHorizontally="false"
|
||||||
android:singleLine="true"
|
android:maxLines="1"
|
||||||
android:text="Item Name" />
|
android:text="Item Name" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/item_details"
|
android:id="@+id/item_details"
|
||||||
style="@style/Base.TextAppearance.AppCompat.SearchResult"
|
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Item Description" />
|
android:text="Item Description" />
|
||||||
|
Loading…
Reference in New Issue
Block a user