From 5279226f3615b5a3f1ae433c6896e7b9a062ae80 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 21 Aug 2016 16:42:50 +0200 Subject: [PATCH] Two-tabs layout: non-cache and cache modules --- .../com/topjohnwu/magisk/WelcomeActivity.java | 2 + .../com/topjohnwu/magisk/model/Module.java | 6 - .../magisk/ui/BaseModuleFragment.java | 84 +++++++++++ .../topjohnwu/magisk/ui/ModulesFragment.java | 139 ++++++++++-------- app/src/main/res/layout/modules_fragment.xml | 22 ++- .../res/layout/single_module_fragment.xml | 14 ++ 6 files changed, 194 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java create mode 100644 app/src/main/res/layout/single_module_fragment.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index 3532d1505..5036696ad 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -113,6 +113,8 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); try { + toolbar.setElevation(navFragment instanceof ModulesFragment ? 0 : 10); + transaction.replace(R.id.content_frame, navFragment).commit(); } catch (IllegalStateException ignored) { } diff --git a/app/src/main/java/com/topjohnwu/magisk/model/Module.java b/app/src/main/java/com/topjohnwu/magisk/model/Module.java index 84734b548..0d2c89d2c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/model/Module.java @@ -9,7 +9,6 @@ import java.io.FileReader; public class Module { private final boolean isValid; - private final boolean isCache; private File mRemoveFile; private File mDisableFile; @@ -21,7 +20,6 @@ public class Module { private String mDescription; public Module(File file) { - this.isCache = file.getPath().contains("cache"); this.isValid = new File(file + "/module.prop").exists(); if (!isValid) return; @@ -35,10 +33,6 @@ public class Module { return isValid && mPropFile != null; } - public boolean isCache() { - return isCache; - } - public String getName() { return mName; } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java new file mode 100644 index 000000000..1b13cc84e --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/BaseModuleFragment.java @@ -0,0 +1,84 @@ +package com.topjohnwu.magisk.ui; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v7.widget.PopupMenu; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.model.Module; +import com.topjohnwu.magisk.rv.ItemClickListener; +import com.topjohnwu.magisk.rv.ModulesAdapter; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public abstract class BaseModuleFragment extends Fragment { + + @BindView(R.id.recyclerView) RecyclerView recyclerView; + + private ItemClickListener moduleActions = new ItemClickListener() { + @Override + public void onItemClick(final View view, final int position) { + PopupMenu popup = new PopupMenu(getContext(), view); + + // Force show icons + try { + Field[] fields = popup.getClass().getDeclaredFields(); + for (Field field : fields) { + if ("mPopup".equals(field.getName())) { + field.setAccessible(true); + Object menuPopupHelper = field.get(popup); + Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); + Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); + setForceIcons.invoke(menuPopupHelper, true); + break; + } + } + } catch (Exception ignored) { + } + + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.remove: + listModules().get(position).createRemoveFile(); + Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); + break; + case R.id.disable: + listModules().get(position).createDisableFile(); + Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); + break; + } + + return false; + } + }); + popup.inflate(R.menu.module_popup); + popup.show(); + } + }; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.single_module_fragment, container, false); + ButterKnife.bind(this, view); + + recyclerView.setAdapter(new ModulesAdapter(listModules(), moduleActions)); + return view; + } + + protected abstract List listModules(); +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java index e1e689528..a17b970bf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/ModulesFragment.java @@ -3,25 +3,22 @@ package com.topjohnwu.magisk.ui; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v7.widget.PopupMenu; -import android.support.v7.widget.RecyclerView; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.model.Module; -import com.topjohnwu.magisk.rv.ItemClickListener; -import com.topjohnwu.magisk.rv.ModulesAdapter; import com.topjohnwu.magisk.ui.utils.Utils; import java.io.File; import java.io.FileFilter; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -33,51 +30,20 @@ public class ModulesFragment extends android.support.v4.app.Fragment { private static final String MAGISK_PATH = "/magisk"; private static final String MAGISK_CACHE_PATH = "/cache/magisk"; - @BindView(R.id.recyclerView) RecyclerView recyclerView; + private static List listModulesNoCache = new ArrayList<>(); + private static List listModulesCache = new ArrayList<>(); + @BindView(R.id.progressBar) ProgressBar progressBar; + @BindView(R.id.pager) ViewPager viewPager; + @BindView(R.id.tab_layout) TabLayout tabLayout; - private List listModules = new ArrayList<>(); + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - private ItemClickListener moduleActions = new ItemClickListener() { - @Override - public void onItemClick(final View view, final int position) { - PopupMenu popup = new PopupMenu(getContext(), view); - try { - Field[] fields = popup.getClass().getDeclaredFields(); - for (Field field : fields) { - if ("mPopup".equals(field.getName())) { - field.setAccessible(true); - Object menuPopupHelper = field.get(popup); - Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName()); - Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class); - setForceIcons.invoke(menuPopupHelper, true); - break; - } - } - } catch (Exception ignored) { - } - - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.remove: - listModules.get(position).createRemoveFile(); - Snackbar.make(view, R.string.remove_file_created, Snackbar.LENGTH_SHORT).show(); - break; - case R.id.disable: - listModules.get(position).createDisableFile(); - Snackbar.make(view, R.string.disable_file_created, Snackbar.LENGTH_SHORT).show(); - break; - } - - return false; - } - }); - popup.inflate(R.menu.module_popup); - popup.show(); - } - }; + listModulesCache.clear(); + listModulesNoCache.clear(); + } @Nullable @Override @@ -85,11 +51,32 @@ public class ModulesFragment extends android.support.v4.app.Fragment { View view = inflater.inflate(R.layout.modules_fragment, container, false); ButterKnife.bind(this, view); + viewPager.setAdapter(new TabsAdapter(getChildFragmentManager())); + tabLayout.setupWithViewPager(viewPager); + new CheckFolders().execute(); return view; } + public static class NoCacheModuleFragment extends BaseModuleFragment { + + @Override + protected List listModules() { + return listModulesNoCache; + } + + } + + public static class CacheModuleFragment extends BaseModuleFragment { + + @Override + protected List listModules() { + return listModulesCache; + } + + } + private class CheckFolders extends AsyncTask { @Override @@ -114,7 +101,11 @@ public class ModulesFragment extends android.support.v4.app.Fragment { for (File mod : magisk) { Module m = new Module(mod); if (m.isValid()) { - listModules.add(m); + try { + m.parse(); + listModulesNoCache.add(m); + } catch (Exception ignored) { + } } } } @@ -123,19 +114,15 @@ public class ModulesFragment extends android.support.v4.app.Fragment { for (File mod : magiskCache) { Module m = new Module(mod); if (m.isValid()) { - listModules.add(m); + try { + m.parse(); + listModulesCache.add(m); + } catch (Exception ignored) { + } } } } - //noinspection Convert2streamapi - for (Module module : listModules) { - try { - module.parse(); - } catch (Exception ignored) { - } - } - return true; } @@ -144,9 +131,37 @@ public class ModulesFragment extends android.support.v4.app.Fragment { super.onPostExecute(result); progressBar.setVisibility(View.GONE); - - recyclerView.setAdapter(new ModulesAdapter(listModules, moduleActions)); } } + private class TabsAdapter extends FragmentPagerAdapter { + + String[] tabTitles = new String[]{ + "_no_cache", "_cache" + // TODO stringify + }; + + public TabsAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public int getCount() { + return tabTitles.length; + } + + @Override + public String getPageTitle(int position) { + return tabTitles[position]; + } + + @Override + public Fragment getItem(int position) { + if (position == 0) { + return new NoCacheModuleFragment(); + } else { + return new CacheModuleFragment(); + } + } + } } diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index d898a4d96..0f9714854 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -6,16 +6,28 @@ android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> + + - + android:layout_height="0dp" + android:layout_weight="1"/> \ No newline at end of file diff --git a/app/src/main/res/layout/single_module_fragment.xml b/app/src/main/res/layout/single_module_fragment.xml new file mode 100644 index 000000000..42e252d5e --- /dev/null +++ b/app/src/main/res/layout/single_module_fragment.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file