mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-30 21:45:27 +00:00
Use recyclerview to show Magisk logs
This commit is contained in:
parent
44b969e0b6
commit
bf7d6ddcb2
@ -0,0 +1,75 @@
|
|||||||
|
package com.topjohnwu.magisk.adapters;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.topjohnwu.magisk.R;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import butterknife.BindView;
|
||||||
|
|
||||||
|
public class MagiskLogAdapter extends RecyclerView.Adapter<MagiskLogAdapter.ViewHolder> {
|
||||||
|
|
||||||
|
private List<String> mList;
|
||||||
|
private int txtWidth = -1;
|
||||||
|
|
||||||
|
public MagiskLogAdapter(List<String> list) {
|
||||||
|
mList = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View v = LayoutInflater.from(parent.getContext())
|
||||||
|
.inflate(R.layout.list_item_magisk_log, parent, false);
|
||||||
|
ViewHolder vh = new ViewHolder(v);
|
||||||
|
if (txtWidth < 0) {
|
||||||
|
int max = 0;
|
||||||
|
String maxStr = "";
|
||||||
|
for (String s : mList) {
|
||||||
|
int len = s.length();
|
||||||
|
if (len > max) {
|
||||||
|
max = len;
|
||||||
|
maxStr = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vh.txt.setText(maxStr);
|
||||||
|
vh.txt.measure(0, 0);
|
||||||
|
txtWidth = vh.txt.getMeasuredWidth();
|
||||||
|
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||||
|
((Activity) parent.getContext()).getWindowManager()
|
||||||
|
.getDefaultDisplay().getMetrics(displayMetrics);
|
||||||
|
if (txtWidth < displayMetrics.widthPixels)
|
||||||
|
txtWidth = displayMetrics.widthPixels;
|
||||||
|
}
|
||||||
|
vh.txt.getLayoutParams().width = txtWidth;
|
||||||
|
return vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
|
||||||
|
holder.txt.setText(mList.get(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return mList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
@BindView(R.id.txt) TextView txt;
|
||||||
|
|
||||||
|
public ViewHolder(@NonNull View v) {
|
||||||
|
super(v);
|
||||||
|
new MagiskLogAdapter$ViewHolder_ViewBinding(this, itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,22 +2,18 @@ package com.topjohnwu.magisk.fragments;
|
|||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.HorizontalScrollView;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.ScrollView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import com.topjohnwu.core.Const;
|
import com.topjohnwu.core.Const;
|
||||||
import com.topjohnwu.core.utils.Utils;
|
import com.topjohnwu.core.utils.Utils;
|
||||||
import com.topjohnwu.magisk.R;
|
import com.topjohnwu.magisk.R;
|
||||||
|
import com.topjohnwu.magisk.adapters.MagiskLogAdapter;
|
||||||
import com.topjohnwu.magisk.components.BaseFragment;
|
import com.topjohnwu.magisk.components.BaseFragment;
|
||||||
import com.topjohnwu.magisk.components.SnackbarMaker;
|
import com.topjohnwu.magisk.components.SnackbarMaker;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
@ -27,14 +23,12 @@ import java.io.IOException;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
|
|
||||||
public class MagiskLogFragment extends BaseFragment {
|
public class MagiskLogFragment extends BaseFragment {
|
||||||
|
|
||||||
@BindView(R.id.txtLog) TextView txtLog;
|
@BindView(R.id.recyclerView) RecyclerView rv;
|
||||||
@BindView(R.id.svLog) ScrollView svLog;
|
|
||||||
@BindView(R.id.hsvLog) HorizontalScrollView hsvLog;
|
|
||||||
@BindView(R.id.progressBar) ProgressBar progressBar;
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@ -42,7 +36,6 @@ public class MagiskLogFragment extends BaseFragment {
|
|||||||
View view = inflater.inflate(R.layout.fragment_magisk_log, container, false);
|
View view = inflater.inflate(R.layout.fragment_magisk_log, container, false);
|
||||||
unbinder = new MagiskLogFragment_ViewBinding(this, view);
|
unbinder = new MagiskLogFragment_ViewBinding(this, view);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
txtLog.setTextIsSelectable(true);
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,13 +75,7 @@ public class MagiskLogFragment extends BaseFragment {
|
|||||||
|
|
||||||
private void readLogs() {
|
private void readLogs() {
|
||||||
Shell.su("cat " + Const.MAGISK_LOG + " | tail -n 5000").submit(result -> {
|
Shell.su("cat " + Const.MAGISK_LOG + " | tail -n 5000").submit(result -> {
|
||||||
progressBar.setVisibility(View.GONE);
|
rv.setAdapter(new MagiskLogAdapter(result.getOut()));
|
||||||
if (result.getOut().isEmpty())
|
|
||||||
txtLog.setText(R.string.log_is_empty);
|
|
||||||
else
|
|
||||||
txtLog.setText(TextUtils.join("\n", result.getOut()));
|
|
||||||
svLog.postDelayed(() -> svLog.fullScroll(ScrollView.FOCUS_DOWN), 100);
|
|
||||||
hsvLog.postDelayed(() -> hsvLog.fullScroll(ScrollView.FOCUS_LEFT), 100);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,12 +94,11 @@ public class MagiskLogFragment extends BaseFragment {
|
|||||||
}
|
}
|
||||||
Shell.su("cat " + Const.MAGISK_LOG + " > " + logFile)
|
Shell.su("cat " + Const.MAGISK_LOG + " > " + logFile)
|
||||||
.submit(result ->
|
.submit(result ->
|
||||||
SnackbarMaker.make(txtLog, logFile.getPath(), Snackbar.LENGTH_SHORT).show());
|
SnackbarMaker.make(rv, logFile.getPath(), Snackbar.LENGTH_SHORT).show());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearLogs() {
|
private void clearLogs() {
|
||||||
Shell.su("echo -n > " + Const.MAGISK_LOG).submit();
|
Shell.su("echo -n > " + Const.MAGISK_LOG).submit();
|
||||||
txtLog.setText(R.string.log_is_empty);
|
SnackbarMaker.make(rv, R.string.logs_cleared, Snackbar.LENGTH_SHORT).show();
|
||||||
SnackbarMaker.make(txtLog, R.string.logs_cleared, Snackbar.LENGTH_SHORT).show();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<ScrollView android:id="@+id/svLog"
|
<HorizontalScrollView
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<HorizontalScrollView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/hsvLog"
|
android:id="@+id/recyclerView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="match_parent"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
|
||||||
|
|
||||||
<LinearLayout
|
</HorizontalScrollView>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:ignore="ScrollViewSize">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/txtLog"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:fontFamily="monospace"
|
|
||||||
android:padding="8dp"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:textSize="10sp" />
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/progressBar"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
</ScrollView>
|
|
7
app/src/main/res/layout/list_item_magisk_log.xml
Normal file
7
app/src/main/res/layout/list_item_magisk_log.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/txt"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fontFamily="monospace"
|
||||||
|
android:textSize="10sp" />
|
Loading…
Reference in New Issue
Block a user