Change permission and tracker list to RecyclerView

Add permission description (Fix #10)
Change permission code to permission label
This commit is contained in:
Schoumi 2018-04-11 23:33:23 +02:00
parent 357500df9a
commit 13289fcfaf
7 changed files with 294 additions and 33 deletions

View File

@ -0,0 +1,93 @@
package org.eu.exodus_privacy.exodusprivacy.adapters;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.eu.exodus_privacy.exodusprivacy.R;
import org.eu.exodus_privacy.exodusprivacy.databinding.PermissionItemBinding;
import org.eu.exodus_privacy.exodusprivacy.databinding.TrackerItemBinding;
import org.eu.exodus_privacy.exodusprivacy.objects.Permission;
import org.eu.exodus_privacy.exodusprivacy.objects.Tracker;
import java.util.List;
import java.util.Set;
public class PermissionListAdapter extends RecyclerView.Adapter<PermissionListAdapter.TrackerListViewHolder>{
private List<Permission> permissionList;
public PermissionListAdapter(List<Permission> permissions) {
setPermisions(permissions);
}
@NonNull
@Override
public PermissionListAdapter.TrackerListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
PermissionItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.permission_item,parent,false);
return new TrackerListViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull PermissionListAdapter.TrackerListViewHolder holder, int position) {
if(permissionList == null || permissionList.size() == 0)
holder.setupData(null);
else
holder.setupData(permissionList.get(position));
}
@Override
public int getItemCount() {
if(permissionList == null || permissionList.size() == 0)
return 1;
else
return permissionList.size();
}
public void setPermisions(List<Permission> permisions) {
permissionList = permisions;
}
class TrackerListViewHolder extends RecyclerView.ViewHolder {
PermissionItemBinding permissionItemBinding;
TrackerListViewHolder(PermissionItemBinding dataBinding) {
super(dataBinding.getRoot());
permissionItemBinding = dataBinding;
}
void setupData(Permission permission) {
if(permission != null) {
permissionItemBinding.permissionName.setText(permission.name);
permissionItemBinding.permissionDescription.setText(permission.description);
manageExpanded(permission);
permissionItemBinding.mainLayout.setOnClickListener((View.OnClickListener) v -> {
permission.expanded = !permission.expanded;
manageExpanded(permission);
});
}
else
permissionItemBinding.permissionName.setText(R.string.no_permissions);
}
void manageExpanded(Permission permission) {
if(permission.expanded) {
permissionItemBinding.rightArrow.setVisibility(View.GONE);
permissionItemBinding.downArrow.setVisibility(View.VISIBLE);
permissionItemBinding.permissionDescription.setVisibility(View.VISIBLE);
} else {
permissionItemBinding.rightArrow.setVisibility(View.VISIBLE);
permissionItemBinding.downArrow.setVisibility(View.GONE);
permissionItemBinding.permissionDescription.setVisibility(View.GONE);
}
}
}
}

View File

@ -0,0 +1,74 @@
package org.eu.exodus_privacy.exodusprivacy.adapters;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import org.eu.exodus_privacy.exodusprivacy.R;
import org.eu.exodus_privacy.exodusprivacy.databinding.TrackerItemBinding;
import org.eu.exodus_privacy.exodusprivacy.objects.Tracker;
import java.util.Set;
public class TrackerListAdapter extends android.support.v7.widget.RecyclerView.Adapter<TrackerListAdapter.TrackerListViewHolder>{
private Set<Tracker> trackersList;
private int layout;
public TrackerListAdapter(Set<Tracker> trackerList, int resource) {
setTrackers(trackerList);
layout = resource;
}
@NonNull
@Override
public TrackerListAdapter.TrackerListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),layout,parent,false);
return new TrackerListViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull TrackerListAdapter.TrackerListViewHolder holder, int position) {
if(trackersList == null || trackersList.size() == 0)
holder.setupData(null);
else
holder.setupData((Tracker) trackersList.toArray()[position]);
}
@Override
public int getItemCount() {
if(trackersList == null || trackersList.size() == 0)
return 1;
else
return trackersList.size();
}
public void setTrackers(Set<Tracker> trackers) {
trackersList = trackers;
}
class TrackerListViewHolder extends RecyclerView.ViewHolder {
ViewDataBinding viewDataBinding;
TrackerListViewHolder(ViewDataBinding dataBinding) {
super(dataBinding.getRoot());
viewDataBinding = dataBinding;
}
void setupData(Tracker tracker) {
if(viewDataBinding instanceof TrackerItemBinding) {
TrackerItemBinding binding = (TrackerItemBinding) viewDataBinding;
if(tracker != null)
binding.trackerName.setText(tracker.name);
else
binding.trackerName.setText(R.string.no_trackers);
}
}
}
}

View File

@ -23,8 +23,10 @@ import android.app.Fragment;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -33,8 +35,11 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.eu.exodus_privacy.exodusprivacy.R;
import org.eu.exodus_privacy.exodusprivacy.adapters.PermissionListAdapter;
import org.eu.exodus_privacy.exodusprivacy.adapters.TrackerListAdapter;
import org.eu.exodus_privacy.exodusprivacy.databinding.ReportBinding;
import org.eu.exodus_privacy.exodusprivacy.manager.DatabaseManager;
import org.eu.exodus_privacy.exodusprivacy.objects.Permission;
import org.eu.exodus_privacy.exodusprivacy.objects.Report;
import org.eu.exodus_privacy.exodusprivacy.objects.Tracker;
@ -95,18 +100,33 @@ public class ReportFragment extends Fragment {
reportBinding.permissionsTitle.setText(permissions_text);
//setup permissions list
//Build html permissions list
List<Permission> requestedPermissions = null;
if (packageInfo.requestedPermissions != null && packageInfo.requestedPermissions.length > 0) {
List<String> requestedPermissions = Arrays.asList(packageInfo.requestedPermissions);
String html = buildHtmlList(requestedPermissions);
reportBinding.permissions.loadData(html,"text/html","UTF-8");
} else {
reportBinding.permissions.loadData(getString(R.string.no_permissions),"text/plain", "UTF-8");
requestedPermissions = new ArrayList<>();
for(int i = 0; i < packageInfo.requestedPermissions.length; i++) {
Permission permission = new Permission();
permission.fullName = packageInfo.requestedPermissions[i];
try {
PermissionInfo permissionInfo = packageManager.getPermissionInfo(permission.fullName,PackageManager.GET_META_DATA);
if(permissionInfo.loadDescription(packageManager) != null)
permission.description = permissionInfo.loadDescription(packageManager).toString();
if(permissionInfo.loadLabel(packageManager) != null)
permission.name = permissionInfo.loadLabel(packageManager).toString();
requestedPermissions.add(permission);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
reportBinding.permissions.setLayoutManager(new LinearLayoutManager(context));
PermissionListAdapter permissionAdapter = new PermissionListAdapter(requestedPermissions);
reportBinding.permissions.setAdapter(permissionAdapter);
reportBinding.analysed.setVisibility(View.GONE);
reportBinding.trackersTitle.setVisibility(View.VISIBLE);
reportBinding.trackers.setVisibility(View.VISIBLE);
reportBinding.trackerLayout.setVisibility(View.VISIBLE);
//get trackers
Report report = DatabaseManager.getInstance(context).getReportFor(packageName,versionName);
Set<Tracker> trackers = null;
@ -114,8 +134,7 @@ public class ReportFragment extends Fragment {
trackers = DatabaseManager.getInstance(context).getTrackers(report.trackers);
} else {
reportBinding.analysed.setVisibility(View.VISIBLE);
reportBinding.trackersTitle.setVisibility(View.GONE);
reportBinding.trackers.setVisibility(View.GONE);
reportBinding.trackerLayout.setVisibility(View.GONE);
}
//setup trackers report
String trackers_text;
@ -126,17 +145,9 @@ public class ReportFragment extends Fragment {
reportBinding.trackersTitle.setText(trackers_text);
//setup trackers lists
//build html tracker list
if(trackers != null && trackers.size() > 0) {
List<String> trackersName = new ArrayList<>();
for (Tracker tracker : trackers) {
trackersName.add(tracker.name);
}
String html = buildHtmlList(trackersName);
reportBinding.trackers.loadData(html,"text/html","UTF-8");
} else {
reportBinding.trackers.loadData(getString(R.string.no_trackers),"text/plain","UTF-8");
}
reportBinding.trackers.setLayoutManager(new LinearLayoutManager(context));
TrackerListAdapter trackerAdapter = new TrackerListAdapter(trackers,R.layout.tracker_item);
reportBinding.trackers.setAdapter(trackerAdapter);
//setup creator
if(report != null)
@ -162,15 +173,6 @@ public class ReportFragment extends Fragment {
reportBinding.reportUrl.setText("https://reports.exodus-privacy.eu.org/reports/"+report.id+"/");
}
private String buildHtmlList(List<String> list) {
String html = "<ul>";
for (String item : list) {
html += "<li>"+item+"</li>";
}
html += "</li>";
return html;
}
public void setPackageManager(PackageManager packageManager) {
this.packageManager = packageManager;
}

View File

@ -0,0 +1,8 @@
package org.eu.exodus_privacy.exodusprivacy.objects;
public class Permission {
public String name;
public String fullName;
public String description;
public boolean expanded = false;
}

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
>
<data/>
<LinearLayout
android:id="@+id/main_layout"
android:gravity="center"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:gravity="center"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="▶"
android:id="@+id/right_arrow"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
/>
<TextView
android:text="▼"
android:id="@+id/down_arrow"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
/>
<TextView
android:id="@+id/permission_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView
android:paddingLeft="20dp"
android:paddingStart="20dp"
android:id="@+id/permission_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>

View File

@ -75,6 +75,7 @@
>
<LinearLayout
android:id="@+id/tracker_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="50"
@ -89,8 +90,10 @@
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@android:color/white" />
<WebView
<android.support.v7.widget.RecyclerView
android:id="@+id/trackers"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
@ -110,9 +113,10 @@
android:textColor="@android:color/white"
/>
<WebView
<android.support.v7.widget.RecyclerView
android:id="@+id/permissions"
android:layout_marginTop="10dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
>
<data/>
<LinearLayout
android:gravity="center"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="●"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
/>
<TextView
android:id="@+id/tracker_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>