Magisk/app/src/full/java/com/topjohnwu/magisk/adapters/SuLogAdapter.java

144 lines
5.2 KiB
Java
Raw Normal View History

2017-01-27 18:10:50 +01:00
package com.topjohnwu.magisk.adapters;
2019-01-24 21:15:31 +01:00
import android.content.Context;
2017-01-27 18:10:50 +01:00
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import com.topjohnwu.magisk.R;
2019-01-28 20:51:29 +01:00
import com.topjohnwu.magisk.components.ExpandableViewHolder;
2019-01-30 09:10:12 +01:00
import com.topjohnwu.magisk.container.SuLogEntry;
import com.topjohnwu.magisk.database.MagiskDB;
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
import java.util.Collections;
2017-01-27 18:10:50 +01:00
import java.util.HashSet;
import java.util.List;
import java.util.Set;
2017-01-27 18:10:50 +01:00
2018-09-10 08:27:45 +02:00
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
public class SuLogAdapter extends SectionedAdapter<SuLogAdapter.SectionHolder, SuLogAdapter.LogViewHolder> {
2017-01-27 18:10:50 +01:00
private List<List<SuLogEntry>> logEntries;
2017-07-23 18:34:34 +02:00
private Set<Integer> itemExpanded, sectionExpanded;
private MagiskDB suDB;
2017-01-27 18:10:50 +01:00
public SuLogAdapter(MagiskDB db) {
2017-07-23 18:34:34 +02:00
suDB = db;
logEntries = Collections.emptyList();
2017-07-23 18:34:34 +02:00
sectionExpanded = new HashSet<>();
itemExpanded = new HashSet<>();
2017-01-27 18:10:50 +01:00
}
2017-07-23 18:34:34 +02:00
@Override
public int getSectionCount() {
return logEntries.size();
2017-01-27 18:10:50 +01:00
}
2017-07-23 18:34:34 +02:00
@Override
public int getItemCount(int section) {
return sectionExpanded.contains(section) ? logEntries.get(section).size() : 0;
2017-07-23 18:34:34 +02:00
}
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
@Override
public SectionHolder onCreateSectionViewHolder(ViewGroup parent) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_sulog_group, parent, false);
return new SectionHolder(v);
}
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
@Override
public LogViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_sulog, parent, false);
return new LogViewHolder(v);
}
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
@Override
public void onBindSectionViewHolder(SectionHolder holder, int section) {
SuLogEntry entry = logEntries.get(section).get(0);
2017-07-23 18:34:34 +02:00
holder.arrow.setRotation(sectionExpanded.contains(section) ? 180 : 0);
holder.itemView.setOnClickListener(v -> {
RotateAnimation rotate;
if (sectionExpanded.contains(section)) {
holder.arrow.setRotation(0);
rotate = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sectionExpanded.remove(section);
notifyItemRangeRemoved(getItemPosition(section, 0), logEntries.get(section).size());
2017-07-23 18:34:34 +02:00
} else {
rotate = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sectionExpanded.add(section);
notifyItemRangeInserted(getItemPosition(section, 0), logEntries.get(section).size());
2017-07-23 18:34:34 +02:00
}
rotate.setDuration(300);
rotate.setFillAfter(true);
holder.arrow.setAnimation(rotate);
});
holder.date.setText(entry.getDateString());
}
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
@Override
public void onBindItemViewHolder(LogViewHolder holder, int section, int position) {
SuLogEntry entry = logEntries.get(section).get(position);
int realIdx = getItemPosition(section, position);
2019-01-28 20:51:29 +01:00
holder.expandable.setExpanded(itemExpanded.contains(realIdx));
2017-07-23 18:34:34 +02:00
holder.itemView.setOnClickListener(view -> {
2019-01-28 20:51:29 +01:00
if (holder.expandable.isExpanded()) {
holder.expandable.collapse();
itemExpanded.remove(realIdx);
2017-07-23 18:34:34 +02:00
} else {
2019-01-28 20:51:29 +01:00
holder.expandable.expand();
itemExpanded.add(realIdx);
}
2017-07-23 18:34:34 +02:00
});
2019-01-24 21:15:31 +01:00
Context context = holder.itemView.getContext();
2017-07-23 18:34:34 +02:00
holder.appName.setText(entry.appName);
holder.action.setText(entry.action ? R.string.grant : R.string.deny);
2019-01-24 21:15:31 +01:00
holder.pid.setText(context.getString(R.string.pid, entry.fromPid));
holder.uid.setText(context.getString(R.string.target_uid, entry.toUid));
holder.command.setText(context.getString(R.string.command, entry.command));
2017-07-23 18:34:34 +02:00
holder.time.setText(entry.getTimeString());
2017-01-27 18:10:50 +01:00
}
2017-07-23 18:34:34 +02:00
public void notifyDBChanged() {
logEntries = suDB.getLogs();
2017-07-23 18:34:34 +02:00
itemExpanded.clear();
sectionExpanded.clear();
sectionExpanded.add(0);
notifyDataSetChanged();
2017-01-27 18:10:50 +01:00
}
static class SectionHolder extends RecyclerView.ViewHolder {
2017-01-27 18:10:50 +01:00
@BindView(R.id.date) TextView date;
@BindView(R.id.arrow) ImageView arrow;
2017-01-27 18:10:50 +01:00
2017-07-23 18:34:34 +02:00
SectionHolder(View itemView) {
2017-01-27 18:10:50 +01:00
super(itemView);
new SuLogAdapter$SectionHolder_ViewBinding(this, itemView);
2017-01-27 18:10:50 +01:00
}
}
2019-01-28 20:51:29 +01:00
static class LogViewHolder extends RecyclerView.ViewHolder {
2017-06-20 11:55:33 +02:00
@BindView(R.id.app_name) TextView appName;
@BindView(R.id.action) TextView action;
@BindView(R.id.time) TextView time;
2019-01-24 21:15:31 +01:00
@BindView(R.id.pid) TextView pid;
@BindView(R.id.uid) TextView uid;
@BindView(R.id.cmd) TextView command;
@BindView(R.id.expand_layout) ViewGroup expandLayout;
2019-01-28 20:51:29 +01:00
ExpandableViewHolder expandable;
2017-01-27 18:10:50 +01:00
2017-06-20 11:55:33 +02:00
LogViewHolder(View itemView) {
2017-01-27 18:10:50 +01:00
super(itemView);
new SuLogAdapter$LogViewHolder_ViewBinding(this, itemView);
2019-01-28 20:51:29 +01:00
expandable = new ExpandableViewHolder(expandLayout);
2017-01-27 18:10:50 +01:00
}
}
}