Improve repo adapter

Fix #435
This commit is contained in:
topjohnwu 2019-03-23 23:18:26 -04:00
parent 8ac3aaf36c
commit f36ce905aa
6 changed files with 63 additions and 50 deletions

View File

@ -58,7 +58,7 @@ public class MainActivity extends BaseActivity
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
new MainActivity_ViewBinding(this); new MainActivity_ViewBinding(this);
checkHideSection();
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.magisk, R.string.magisk) { ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.magisk, R.string.magisk) {
@ -90,12 +90,6 @@ public class MainActivity extends BaseActivity
navigationView.setNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(this);
} }
@Override
protected void onResume() {
super.onResume();
checkHideSection();
}
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (drawer.isDrawerOpen(navigationView)) { if (drawer.isDrawerOpen(navigationView)) {

View File

@ -74,7 +74,7 @@ public class SplashActivity extends BaseActivity {
// Magisk working as expected // Magisk working as expected
if (Shell.rootAccess() && Config.magiskVersionCode > 0) { if (Shell.rootAccess() && Config.magiskVersionCode > 0) {
// Load modules // Load modules
Utils.loadModules(); Utils.loadModules(false);
// Load repos // Load repos
if (Networking.checkNetworkStatus(this)) if (Networking.checkNetworkStatus(this))
new UpdateRepos().exec(); new UpdateRepos().exec();

View File

@ -10,6 +10,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.TextView; import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -23,14 +24,18 @@ import com.topjohnwu.magisk.container.Repo;
import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.database.RepoDatabaseHelper;
import com.topjohnwu.magisk.dialogs.CustomAlertDialog; import com.topjohnwu.magisk.dialogs.CustomAlertDialog;
import com.topjohnwu.magisk.uicomponents.MarkDownWindow; import com.topjohnwu.magisk.uicomponents.MarkDownWindow;
import com.topjohnwu.magisk.utils.Event;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import butterknife.BindView; import butterknife.BindView;
public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, ReposAdapter.RepoHolder> { public class ReposAdapter
extends SectionedAdapter<ReposAdapter.SectionHolder, ReposAdapter.RepoHolder>
implements Event.AutoListener, SearchView.OnQueryTextListener {
private static final int UPDATES = 0; private static final int UPDATES = 0;
private static final int INSTALLED = 1; private static final int INSTALLED = 1;
@ -41,11 +46,10 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
private RepoDatabaseHelper repoDB; private RepoDatabaseHelper repoDB;
private List<Pair<Integer, List<Repo>>> repoPairs; private List<Pair<Integer, List<Repo>>> repoPairs;
public ReposAdapter(RepoDatabaseHelper db, Map<String, Module> map) { public ReposAdapter(RepoDatabaseHelper db) {
repoDB = db; repoDB = db;
moduleMap = map; moduleMap = Collections.emptyMap();
repoPairs = new ArrayList<>(); repoPairs = new ArrayList<>();
notifyDBChanged();
} }
@ -136,10 +140,27 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
if (repoCursor != null) if (repoCursor != null)
repoCursor.close(); repoCursor.close();
repoCursor = repoDB.getRepoCursor(); repoCursor = repoDB.getRepoCursor();
filter(""); onQueryTextChange("");
} }
public void filter(String s) { @Override
public void onEvent(int event) {
moduleMap = Event.getResult(event);
notifyDataSetChanged();
}
@Override
public int[] getListeningEvents() {
return new int[] {Event.MODULE_LOAD_DONE};
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
List<Repo> updates = new ArrayList<>(); List<Repo> updates = new ArrayList<>();
List<Repo> installed = new ArrayList<>(); List<Repo> installed = new ArrayList<>();
List<Repo> others = new ArrayList<>(); List<Repo> others = new ArrayList<>();
@ -150,7 +171,7 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
if (repo.getName().toLowerCase().contains(s.toLowerCase()) if (repo.getName().toLowerCase().contains(s.toLowerCase())
|| repo.getAuthor().toLowerCase().contains(s.toLowerCase()) || repo.getAuthor().toLowerCase().contains(s.toLowerCase())
|| repo.getDescription().toLowerCase().contains(s.toLowerCase()) || repo.getDescription().toLowerCase().contains(s.toLowerCase())
) { ) {
// Passed the repoFilter // Passed the repoFilter
Module module = moduleMap.get(repo.getId()); Module module = moduleMap.get(repo.getId());
if (module != null) { if (module != null) {
@ -175,6 +196,7 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
repoPairs.add(new Pair<>(OTHERS, others)); repoPairs.add(new Pair<>(OTHERS, others));
notifyDataSetChanged(); notifyDataSetChanged();
return false;
} }
static class SectionHolder extends RecyclerView.ViewHolder { static class SectionHolder extends RecyclerView.ViewHolder {

View File

@ -46,56 +46,43 @@ public class ReposFragment extends BaseFragment {
unbinder = new ReposFragment_ViewBinding(this, view); unbinder = new ReposFragment_ViewBinding(this, view);
mSwipeRefreshLayout.setRefreshing(true); mSwipeRefreshLayout.setRefreshing(true);
recyclerView.setVisibility(View.GONE);
mSwipeRefreshLayout.setOnRefreshListener(() -> new UpdateRepos().exec(true)); mSwipeRefreshLayout.setOnRefreshListener(() -> new UpdateRepos().exec(true));
adapter = new ReposAdapter(app.repoDB);
Event.register(adapter);
recyclerView.setAdapter(adapter);
recyclerView.setVisibility(View.GONE);
requireActivity().setTitle(R.string.downloads); requireActivity().setTitle(R.string.downloads);
return view; return view;
} }
@Override
public void onDestroyView() {
super.onDestroyView();
Event.unregister(adapter);
}
@Override @Override
public int[] getListeningEvents() { public int[] getListeningEvents() {
return new int[] {Event.MODULE_LOAD_DONE, Event.REPO_LOAD_DONE}; return new int[] {Event.REPO_LOAD_DONE};
} }
@Override @Override
public void onEvent(int event) { public void onEvent(int event) {
switch (event) { adapter.notifyDBChanged();
case Event.MODULE_LOAD_DONE: mSwipeRefreshLayout.setRefreshing(false);
adapter = new ReposAdapter(app.repoDB, Event.getResult(event)); boolean empty = adapter.getItemCount() == 0;
recyclerView.setAdapter(adapter); recyclerView.setVisibility(empty ? View.GONE : View.VISIBLE);
break; emptyRv.setVisibility(empty ? View.VISIBLE : View.GONE);
case Event.REPO_LOAD_DONE:
if (adapter != null)
adapter.notifyDBChanged();
break;
}
if (Event.isTriggered(this)) {
mSwipeRefreshLayout.setRefreshing(false);
boolean empty = adapter.getItemCount() == 0;
recyclerView.setVisibility(empty ? View.GONE : View.VISIBLE);
emptyRv.setVisibility(empty ? View.VISIBLE : View.GONE);
}
} }
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_repo, menu); inflater.inflate(R.menu.menu_repo, menu);
SearchView search = (SearchView) menu.findItem(R.id.repo_search).getActionView(); SearchView search = (SearchView) menu.findItem(R.id.repo_search).getActionView();
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { search.setOnQueryTextListener(adapter);
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.filter(newText);
return false;
}
});
} }
@Override @Override

View File

@ -95,8 +95,12 @@ public class Utils {
} }
public static void loadModules() { public static void loadModules() {
loadModules(true);
}
public static void loadModules(boolean async) {
Event.reset(Event.MODULE_LOAD_DONE); Event.reset(Event.MODULE_LOAD_DONE);
App.THREAD_POOL.execute(() -> { Runnable run = () -> {
Map<String, Module> moduleMap = new ValueSortedMap<>(); Map<String, Module> moduleMap = new ValueSortedMap<>();
SuFile path = new SuFile(Const.MAGISK_PATH); SuFile path = new SuFile(Const.MAGISK_PATH);
SuFile[] modules = path.listFiles( SuFile[] modules = path.listFiles(
@ -107,7 +111,11 @@ public class Utils {
moduleMap.put(module.getId(), module); moduleMap.put(module.getId(), module);
} }
Event.trigger(Event.MODULE_LOAD_DONE, moduleMap); Event.trigger(Event.MODULE_LOAD_DONE, moduleMap);
}); };
if (async)
App.THREAD_POOL.execute(run);
else
run.run();
} }
public static boolean showSuperUser() { public static boolean showSuperUser() {

View File

@ -18,7 +18,8 @@
<item <item
android:id="@+id/magiskhide" android:id="@+id/magiskhide"
android:icon="@drawable/ic_magiskhide" android:icon="@drawable/ic_magiskhide"
android:title="@string/magiskhide" /> android:title="@string/magiskhide"
android:visible="false"/>
</group> </group>
@ -29,7 +30,8 @@
<item <item
android:id="@+id/modules" android:id="@+id/modules"
android:icon="@drawable/ic_extension" android:icon="@drawable/ic_extension"
android:title="@string/modules"/> android:title="@string/modules"
android:visible="false"/>
<item <item
android:id="@+id/downloads" android:id="@+id/downloads"