diff --git a/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java b/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java index 530ad3e73..3becab3a3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/BaseModuleFragment.java @@ -1,5 +1,8 @@ package com.topjohnwu.magisk; +import android.animation.Animator; +import android.animation.ValueAnimator; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; @@ -7,18 +10,23 @@ import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.WindowManager; import android.widget.CheckBox; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; +import java.util.ArrayList; import java.util.List; import butterknife.BindView; @@ -35,17 +43,17 @@ public abstract class BaseModuleFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.single_module_fragment, container, false); + View viewMain = inflater.inflate(R.layout.single_module_fragment, container, false); - ButterKnife.bind(this, view); + ButterKnife.bind(this, viewMain); prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); prefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { if (s.contains("updated")) { - view.invalidate(); - view.requestLayout(); + viewMain.invalidate(); + viewMain.requestLayout(); } } @@ -54,7 +62,7 @@ public abstract class BaseModuleFragment extends Fragment { emptyTv.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); - return view; + return viewMain; } recyclerView.setAdapter(new ModulesAdapter(listModules(), (chk, position) -> { @@ -79,7 +87,7 @@ public abstract class BaseModuleFragment extends Fragment { listModules().get(position).deleteRemoveFile(); Snackbar.make(undeleteBtn, R.string.remove_file_deleted, Snackbar.LENGTH_SHORT).show(); })); - return view; + return viewMain; } @@ -88,12 +96,21 @@ public abstract class BaseModuleFragment extends Fragment { public class ModulesAdapter extends RecyclerView.Adapter { private final List mList; + List mExpandedList; + @BindView(R.id.expand_layout) + LinearLayout expandedLayout; + private View viewMain; + private Context context; private final Utils.ItemClickListener chboxListener; private final Utils.ItemClickListener deleteBtnListener; private final Utils.ItemClickListener unDeleteBtnListener; public ModulesAdapter(List list, Utils.ItemClickListener chboxListener, Utils.ItemClickListener deleteBtnListener, Utils.ItemClickListener undeleteBtnListener) { this.mList = list; + mExpandedList = new ArrayList<>(mList.size()); + for (int i = 0; i < mList.size(); i++) { + mExpandedList.add(false); + } this.chboxListener = chboxListener; this.deleteBtnListener = deleteBtnListener; this.unDeleteBtnListener = undeleteBtnListener; @@ -101,9 +118,10 @@ public abstract class BaseModuleFragment extends Fragment { @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_module, parent, false); - - return new ViewHolder(view); + viewMain = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_module, parent, false); + context = parent.getContext(); + ButterKnife.bind(this, viewMain); + return new ViewHolder(viewMain); } @Override @@ -158,15 +176,103 @@ public abstract class BaseModuleFragment extends Fragment { @BindView(R.id.checkbox) CheckBox checkBox; @BindView(R.id.delete) ImageView delete; + @BindView(R.id.expand_layout) + LinearLayout expandLayout; + private ValueAnimator mAnimator; + private int mMeasuredHeight; public ViewHolder(View itemView) { super(itemView); + WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); ButterKnife.bind(this, itemView); + DisplayMetrics dimension = new DisplayMetrics(); + windowmanager.getDefaultDisplay().getMetrics(dimension); + final int mHeight = dimension.heightPixels; + expandLayout.getViewTreeObserver().addOnPreDrawListener( + new ViewTreeObserver.OnPreDrawListener() { + + @Override + public boolean onPreDraw() { + expandLayout.getViewTreeObserver().removeOnPreDrawListener(this); + expandLayout.setVisibility(View.GONE); + + final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + final int heightSpec = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); + expandLayout.measure(widthSpec, heightSpec); + mAnimator = slideAnimator(0, expandLayout.getMeasuredHeight()); + return true; + } + }); + + viewMain.setOnClickListener(view -> { + int position = getAdapterPosition(); + Log.d("Magisk", "BaseRepoFragment: CLICK. " + position + " and " + mExpandedList.get(position)); + + if (mExpandedList.get(position)) { + collapse(expandLayout); + } else { + expand(expandLayout); + } + mExpandedList.set(position, !mExpandedList.get(position)); + + }); if (!Shell.rootAccess()) { checkBox.setEnabled(false); delete.setEnabled(false); } } + private void expand(View view) { + + // set Visible + + + Log.d("Magisk", "BaseRepoFragment: Expand anim called " + mMeasuredHeight + " and " + view.getId()); + view.setVisibility(View.VISIBLE); + mAnimator.start(); + } + + private void collapse(View view) { + int finalHeight = view.getHeight(); + ValueAnimator mAnimator = slideAnimator(finalHeight, 0); + Log.d("Magisk", "BaseRepoFragment: Collapse anim called " + finalHeight + " and " + view.getId()); + + mAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationEnd(Animator animator) { + // Height=0, but it set visibility to GONE + view.setVisibility(View.GONE); + } + + @Override + public void onAnimationStart(Animator animator) { + } + + @Override + public void onAnimationCancel(Animator animator) { + } + + @Override + public void onAnimationRepeat(Animator animator) { + } + }); + mAnimator.start(); + } + + private ValueAnimator slideAnimator(int start, int end) { + + ValueAnimator animator = ValueAnimator.ofInt(start, end); + + animator.addUpdateListener(valueAnimator -> { + // Update Height + int value = (Integer) valueAnimator.getAnimatedValue(); + + ViewGroup.LayoutParams layoutParams = expandLayout + .getLayoutParams(); + layoutParams.height = value; + expandLayout.setLayoutParams(layoutParams); + }); + return animator; + } } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/BaseRepoFragment.java b/app/src/main/java/com/topjohnwu/magisk/BaseRepoFragment.java index 082e14878..bdf96520d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/BaseRepoFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/BaseRepoFragment.java @@ -1,26 +1,33 @@ package com.topjohnwu.magisk; +import android.animation.Animator; +import android.animation.ValueAnimator; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Color; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; +import android.text.util.Linkify; +import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.topjohnwu.magisk.module.Repo; -import com.topjohnwu.magisk.utils.AnimationHelper; import com.topjohnwu.magisk.utils.Utils; import java.io.File; +import java.util.ArrayList; import java.util.List; import butterknife.BindView; @@ -33,15 +40,11 @@ public abstract class BaseRepoFragment extends Fragment { @BindView(R.id.empty_rv) TextView emptyTv; - - - @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); if (listRepos().size() == 0) { @@ -50,7 +53,7 @@ public abstract class BaseRepoFragment extends Fragment { return view; } - Log.d("Magisk","BaseRepoFragment: ListRepos size is " + listRepos().size()); + Log.d("Magisk", "BaseRepoFragment: ListRepos size is " + listRepos().size()); recyclerView.setAdapter(new ReposAdapter(listRepos()) { }); @@ -63,21 +66,23 @@ public abstract class BaseRepoFragment extends Fragment { public class ReposAdapter extends RecyclerView.Adapter { private final List mList; - private View viewMain; - private Context context; + List mExpandedList; @BindView(R.id.update) ImageView updateImage; @BindView(R.id.installed) ImageView installedImage; -// @BindView(R.id.popup_layout) -// LinearLayout popupLayout; - - - private boolean isCardExpanded; + @BindView(R.id.expand_layout) + LinearLayout expandedLayout; + private View viewMain; + private Context context; private boolean mIsInstalled, mCanUpdate; public ReposAdapter(List list) { this.mList = list; + mExpandedList = new ArrayList<>(mList.size()); + for (int i = 0; i < mList.size(); i++) { + mExpandedList.add(false); + } } @@ -92,64 +97,69 @@ public abstract class BaseRepoFragment extends Fragment { @Override public void onBindViewHolder(final ViewHolder holder, int position) { final Repo repo = mList.get(position); - Log.d("Magisk","ReposAdapter: Trying set up bindview from list pos " + position + " out of a total of " + mList.size() + " and " + repo.getId() ); + + Log.d("Magisk", "ReposAdapter: Trying set up bindview from list pos " + position + " out of a total of " + mList.size() + " and " + repo.getId()); if (repo.getId() != null) { + TextView authorView = holder.author; holder.title.setText(repo.getName()); holder.versionName.setText(repo.getmVersion()); holder.description.setText(repo.getDescription()); + String authorString = getResources().getString(R.string.author) + " " + repo.getmAuthor(); + holder.author.setText(authorString); + if ((repo.getmLogUrl() != null) && (repo.getmLogUrl().equals(""))) { + holder.log.setText(repo.getmLogUrl()); + Linkify.addLinks(holder.log, Linkify.WEB_URLS); + } else { + holder.log.setVisibility(View.GONE); + } + holder.installedStatus.setText(repo.isInstalled() ? getResources().getString(R.string.module_installed) : getResources().getString(R.string.module_not_installed)); + if (mExpandedList.get(position)) { + holder.expandLayout.setVisibility(View.VISIBLE); + } else { + holder.expandLayout.setVisibility(View.GONE); + } + if (repo.isInstalled()) { + holder.installedStatus.setTextColor(Color.parseColor("#14AD00")); + holder.updateStatus.setText(repo.canUpdate() ? getResources().getString(R.string.module_update_available) : getResources().getString(R.string.module_up_to_date)); + } Log.d("Magisk", "ReposAdapter: Setting up info " + repo.getId() + " and " + repo.getDescription() + " and " + repo.getmVersion()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (prefs.contains("repo-isInstalled_" + repo.getId())) { - mIsInstalled = prefs.getBoolean("repo-isInstalled_" + repo.getId(), false); - if (mIsInstalled) { - installedImage.setImageResource(R.drawable.ic_done_black); - } - mCanUpdate = prefs.getBoolean("repo-isInstalled_" + repo.getId(), false); - if (mCanUpdate) { - updateImage.setImageResource(R.drawable.ic_system_update_alt_black); - } - } - - isCardExpanded = false; -// AnimationHelper.collapse(popupLayout); - - viewMain.setOnClickListener(new View.OnClickListener() { + updateImage.setImageResource(R.drawable.ic_system_update_alt_black); + mCanUpdate = prefs.getBoolean("repo-isInstalled_" + repo.getId(), false); + updateImage.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View view) { - if (isCardExpanded) { -// AnimationHelper.expand(popupLayout); - isCardExpanded = false; + if (!mIsInstalled | mCanUpdate) { + + Utils.DownloadReceiver reciever = new Utils.DownloadReceiver() { + @Override + public void task(File file) { + Log.d("Magisk", "Task firing"); + new Utils.FlashZIP(context, repo.getId(), file.toString()).execute(); + } + }; + String filename = repo.getId().replace(" ", "") + ".zip"; + Utils.downloadAndReceive(context, reciever, repo.getmZipUrl(), filename); } else { -// AnimationHelper.collapse(popupLayout); - isCardExpanded = true; - + Toast.makeText(context, repo.getId() + " is already installed.", Toast.LENGTH_SHORT).show(); } - -// if (!mIsInstalled | mCanUpdate) { -// -// Utils.DownloadReceiver reciever = new Utils.DownloadReceiver() { -// @Override -// public void task(File file) { -// Log.d("Magisk", "Task firing"); -// new Utils.FlashZIP(context, repo.getId(), file.toString()).execute(); -// } -// }; -// String filename = repo.getId().replace(" ", "") + ".zip"; -// Utils.downloadAndReceive(context, reciever, repo.getmZipUrl(), filename); -// } else { -// Toast.makeText(context,repo.getId() + " is already installed.", Toast.LENGTH_SHORT).show(); -// } } }); + if (prefs.contains("repo-isInstalled_" + repo.getId())) { + mIsInstalled = prefs.getBoolean("repo-isInstalled_" + repo.getId(), false); +// if (mIsInstalled) { +// installedImage.setImageResource(R.drawable.ic_done_black); +// } + + } + + } } - - @Override public int getItemCount() { return mList.size(); @@ -157,15 +167,120 @@ public abstract class BaseRepoFragment extends Fragment { class ViewHolder extends RecyclerView.ViewHolder { - @BindView(R.id.title) TextView title; - @BindView(R.id.version_name) TextView versionName; - @BindView(R.id.description) TextView description; + @BindView(R.id.title) + TextView title; + @BindView(R.id.version_name) + TextView versionName; + @BindView(R.id.description) + TextView description; + @BindView(R.id.author) + TextView author; + @BindView(R.id.log) + TextView log; + @BindView(R.id.installedStatus) + TextView installedStatus; + @BindView(R.id.updateStatus) + TextView updateStatus; + @BindView(R.id.expand_layout) + LinearLayout expandLayout; + private ValueAnimator mAnimator; + private int mMeasuredHeight; public ViewHolder(View itemView) { super(itemView); + WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); ButterKnife.bind(this, itemView); + + DisplayMetrics dimension = new DisplayMetrics(); + windowmanager.getDefaultDisplay().getMetrics(dimension); + final int mHeight = dimension.heightPixels; + expandLayout.getViewTreeObserver().addOnPreDrawListener( + new ViewTreeObserver.OnPreDrawListener() { + + @Override + public boolean onPreDraw() { + expandLayout.getViewTreeObserver().removeOnPreDrawListener(this); + expandLayout.setVisibility(View.GONE); + + final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + expandLayout.measure(widthSpec, heightSpec); + mAnimator = slideAnimator(0, expandLayout.getMeasuredHeight()); + return true; + } + + }); + + viewMain.setOnClickListener(view -> { + int position = getAdapterPosition(); + Log.d("Magisk", "BaseRepoFragment: CLICK. " + position + " and " + mExpandedList.get(position)); + + if (mExpandedList.get(position)) { + collapse(expandLayout); + } else { + expand(expandLayout); + } + mExpandedList.set(position, !mExpandedList.get(position)); + + }); + } + + private void expand(View view) { + + // set Visible + + + Log.d("Magisk", "BaseRepoFragment: Expand anim called " + mMeasuredHeight + " and " + view.getId()); + view.setVisibility(View.VISIBLE); + mAnimator.start(); + } + + private void collapse(View view) { + int finalHeight = view.getHeight(); + ValueAnimator mAnimator = slideAnimator(finalHeight, 0); + Log.d("Magisk", "BaseRepoFragment: Collapse anim called " + finalHeight + " and " + view.getId()); + + mAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationEnd(Animator animator) { + // Height=0, but it set visibility to GONE + view.setVisibility(View.GONE); + } + + @Override + public void onAnimationStart(Animator animator) { + } + + @Override + public void onAnimationCancel(Animator animator) { + } + + @Override + public void onAnimationRepeat(Animator animator) { + } + }); + mAnimator.start(); + } + + private ValueAnimator slideAnimator(int start, int end) { + + ValueAnimator animator = ValueAnimator.ofInt(start, end); + + animator.addUpdateListener(valueAnimator -> { + // Update Height + int value = (Integer) valueAnimator.getAnimatedValue(); + + ViewGroup.LayoutParams layoutParams = expandLayout + .getLayoutParams(); + layoutParams.height = value; + expandLayout.setLayoutParams(layoutParams); + }); + return animator; + } + + } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index 6a2cc8ea0..4dd1c2ceb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -41,9 +41,7 @@ public class ModulesFragment extends Fragment { public static List listModulesCache = new ArrayList<>(); public static List listModulesDownload = new ArrayList<>(); private static final int FILE_SELECT_CODE = 0; - private TabsAdapter ta; - private File input; - private SwipeRefreshLayout mSwipeRefreshLayout; + private int viewPagePosition; @BindView(R.id.progressBar) ProgressBar progressBar; @BindView(R.id.fab) FloatingActionButton fabio; @@ -56,7 +54,7 @@ public class ModulesFragment extends Fragment { View view = inflater.inflate(R.layout.modules_fragment, container, false); ButterKnife.bind(this, view); - //new Utils.LoadModules(getActivity(),false).execute(); + new Utils.LoadModules(getActivity(),false).execute(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); new updateUI().execute(); setHasOptionsMenu(true); @@ -101,12 +99,14 @@ public class ModulesFragment extends Fragment { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.force_reload: + viewPagePosition = tabLayout.getSelectedTabPosition(); listModules.clear(); listModulesCache.clear(); listModulesDownload.clear(); progressBar.setVisibility(View.VISIBLE); viewPager.setAdapter(new TabsAdapter(getChildFragmentManager())); tabLayout.setupWithViewPager(viewPager); + viewPager.setCurrentItem(viewPagePosition); new Utils.LoadModules(getActivity(),true).execute(); new updateUI().execute(); break; @@ -115,6 +115,11 @@ public class ModulesFragment extends Fragment { return super.onOptionsItemSelected(item); } + void selectPage(int pageIndex){ + tabLayout.setScrollPosition(pageIndex,0f,true); + viewPager.setCurrentItem(pageIndex); + } + public static class NormalModuleFragment extends BaseModuleFragment { @Override @@ -154,9 +159,10 @@ public class ModulesFragment extends Fragment { super.onPostExecute(v); progressBar.setVisibility(View.GONE); - viewPager.setAdapter(new TabsAdapter(getChildFragmentManager())); tabLayout.setupWithViewPager(viewPager); + selectPage(viewPagePosition); + } } @@ -186,7 +192,7 @@ public class ModulesFragment extends Fragment { return new NormalModuleFragment(); } else if (position == 1) { return new CacheModuleFragment(); - } else { + } else { return new DownloadModuleFragment(); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java b/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java index 40db33fe8..1a04c0363 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java @@ -29,7 +29,7 @@ public class RepoHelper { private static final String TAG_ID = "id"; private static final String TAG_NAME = "name"; private static String TAG = "Magisk"; - private String mName,mId,mUrl; + private String mName, mId, mUrl; private Context activityContext; private Date updatedDate, currentDate; private SharedPreferences prefs; @@ -44,35 +44,7 @@ public class RepoHelper { List out = null; } else { Log.d(TAG, "RepoHelper: Building from cache"); - repos.clear(); - Map map = prefs.getAll(); - for(Map.Entry entry : map.entrySet()){ - if (entry.getKey().contains("repo_")) { - Log.d("Magisk","RepoHelper: found entry for repo " + entry.getKey()); - String repoString = entry.getValue().toString().replace(""", "\""); - String[] repoStrings = repoString.split("\n"); - for(String string : repoStrings) { - String[] splitStrings = string.split("="); - switch(splitStrings[0]) { - case ("id"): - mId = splitStrings[1]; - break; - case ("baseUrl"): - mUrl = splitStrings[1]; - break; - default: - break; - } - - } - Log.d("Magisk","RepoHelper: adding repo with id of " + mId); - repos.add(new Repo(repoString,activityContext)); - - - } - - } - + BuildFromCache(); } @@ -81,6 +53,37 @@ public class RepoHelper { return repos; } + private void BuildFromCache() { + repos.clear(); + Map map = prefs.getAll(); + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey().contains("repo_")) { + Log.d("Magisk", "RepoHelper: found entry for repo " + entry.getKey()); + String repoString = entry.getValue().toString().replace(""", "\""); + String[] repoStrings = repoString.split("\n"); + for (String string : repoStrings) { + String[] splitStrings = string.split("="); + switch (splitStrings[0]) { + case ("id"): + mId = splitStrings[1]; + break; + case ("baseUrl"): + mUrl = splitStrings[1]; + break; + default: + break; + } + + } + Log.d("Magisk", "RepoHelper: adding repo with id of " + mId); + repos.add(new Repo(repoString, activityContext)); + + + } + + } + } + class MyAsyncTask extends AsyncTask { @@ -105,9 +108,9 @@ public class RepoHelper { // Making a request to url and getting response String token = activityContext.getString(R.string.some_string); - String jsonStr = webreq.makeWebServiceCall(url + Utils.procFile(token,activityContext), WebRequest.GET); + String jsonStr = webreq.makeWebServiceCall(url + Utils.procFile(token, activityContext), WebRequest.GET); Log.d("Magisk", "doInBackground Running, String: " + jsonStr + " Url: " + url); - if(jsonStr != null && !jsonStr.isEmpty()) { + if (jsonStr != null && !jsonStr.isEmpty()) { try { repos.clear(); @@ -185,7 +188,9 @@ public class RepoHelper { protected void onPostExecute(Void v) { if (apiFail) { - Toast.makeText(activityContext,"GitHub API Limit reached, please try refreshing again in an hour.",Toast.LENGTH_LONG).show(); + Toast.makeText(activityContext, "GitHub API Limit reached, please try refreshing again in an hour.", Toast.LENGTH_LONG).show(); + } else { + BuildFromCache(); } } // protected void onPostExecute(Void v) diff --git a/app/src/main/res/drawable/ic_system_update_alt_black.xml b/app/src/main/res/drawable/ic_system_update_alt_black.xml index 25b07b5b4..fb2d85e57 100644 --- a/app/src/main/res/drawable/ic_system_update_alt_black.xml +++ b/app/src/main/res/drawable/ic_system_update_alt_black.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/layout/list_item_module.xml b/app/src/main/res/layout/list_item_module.xml index 6a22df864..00ce343c2 100644 --- a/app/src/main/res/layout/list_item_module.xml +++ b/app/src/main/res/layout/list_item_module.xml @@ -13,6 +13,10 @@ android:minHeight="?android:attr/listPreferredItemHeight" card_view:cardCornerRadius="2dp" card_view:cardElevation="2dp"> + + + + + + + diff --git a/app/src/main/res/layout/list_item_repo.xml b/app/src/main/res/layout/list_item_repo.xml index 71f9d461e..bda43c4fc 100644 --- a/app/src/main/res/layout/list_item_repo.xml +++ b/app/src/main/res/layout/list_item_repo.xml @@ -60,22 +60,64 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:textIsSelectable="false"/> + + + + + + + + + android:layout_height="match_parent" + android:focusable="false" + android:gravity="center" + android:padding="5dp" + /> + android:layout_height="match_parent" + android:focusable="false" + android:gravity="center" + android:padding="5dp" /> - + diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index 7c954d6a2..ae6bca833 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -1,54 +1,67 @@ - - - + - + - + + + + + - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8eb8263ae..065a40f8a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,5 @@ 650dp 500dp + 100dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9be26d621..6c927aad8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,13 +42,15 @@ Cache modules No modules found - Update available - Module is up-to-date + An update is available + Module is up-to-date Module is installed + Module is not installed Module will be removed at next reboot Module will not be removed at next reboot Module will be disabled at next reboot Module will be enabled at next reboot + Created by Save to SD