From fea85e469df46838c8d65f6f4734790e9932d536 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 4 Nov 2014 20:39:40 +0100 Subject: Make Faq look nicer, especially on large device by using cardviews --- main/build.gradle | 3 + .../de/blinkt/openvpn/fragments/FaqFragment.java | 75 ++++++++--- .../blinkt/openvpn/fragments/FaqViewAdapter.java | 80 +++++++++++ main/src/main/res/layout/faq.xml | 146 +-------------------- main/src/main/res/layout/faqcard.xml | 38 ++++++ main/src/main/res/values/styles.xml | 2 +- 6 files changed, 183 insertions(+), 161 deletions(-) create mode 100644 main/src/main/java/de/blinkt/openvpn/fragments/FaqViewAdapter.java create mode 100644 main/src/main/res/layout/faqcard.xml (limited to 'main') diff --git a/main/build.gradle b/main/build.gradle index 1c884cf1..750c3eb9 100644 --- a/main/build.gradle +++ b/main/build.gradle @@ -8,6 +8,9 @@ repositories { dependencies { compile 'com.intellij:annotations:12.0' + compile 'com.android.support:cardview-v7:21.0.+' + compile 'com.android.support:recyclerview-v7:21.0.+' + // compile 'ch.acra:acra:4.5.0' } diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/FaqFragment.java b/main/src/main/java/de/blinkt/openvpn/fragments/FaqFragment.java index 907ae226..471d62c1 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/FaqFragment.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/FaqFragment.java @@ -8,42 +8,75 @@ package de.blinkt.openvpn.fragments; import android.app.Fragment; import android.os.Build; import android.os.Bundle; -import android.text.Html; -import android.text.method.LinkMovementMethod; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; + import de.blinkt.openvpn.R; public class FaqFragment extends Fragment { +private static int[] faqitems[] = + { + {R.string.faq_howto_title, R.string.faq_howto}, + {R.string.faq_vpndialog43_title, R.string.faq_vpndialog43}, + {R.string.faq_system_dialogs_title, R.string.faq_system_dialogs}, + {R.string.faq_duplicate_notification_title, R.string.faq_duplicate_notification}, + {R.string.battery_consumption_title, R.string.baterry_consumption}, + {R.string.tap_mode, R.string.faq_tap_mode}, + {R.string.vpn_tethering_title, R.string.faq_tethering}, + {R.string.faq_security_title, R.string.faq_security}, + {R.string.broken_images, R.string.broken_images_faq}, + {R.string.faq_shortcut, R.string.faq_howto_shortcut}, + {R.string.tap_mode, R.string.tap_faq2}, + {R.string.copying_log_entries, R.string.faq_copying}, + {R.string.tap_mode, R.string.tap_faq3}, + {R.string.faq_routing_title, R.string.faq_routing} + }; + private RecyclerView mRecyclerView; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v= inflater.inflate(R.layout.faq, container, false); - - insertHtmlEntry(v, R.id.broken_images_faq,R.string.broken_images_faq); - insertHtmlEntry(v, R.id.faq_howto,R.string.faq_howto); - insertHtmlEntry(v, R.id.baterry_consumption, R.string.baterry_consumption); - insertHtmlEntry(v, R.id.faq_tethering, R.string.faq_tethering); - insertHtmlEntry(v, R.id.faq_vpndialog43, R.string.faq_vpndialog43); - insertHtmlEntry(v, R.id.faq_system_dialog_xposed, R.string.faq_system_dialog_xposed); - - /* I think the problem mentioned in there should not affect, 4.3+ */ - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - v.findViewById(R.id.broken_images_faq).setVisibility(View.GONE); - v.findViewById(R.id.broken_images_faq_title).setVisibility(View.GONE); - } + + int dpwidth = (int) (container.getWidth()/getResources().getDisplayMetrics().density); + int columns = dpwidth/400; + columns = Math.max(1, columns); + + + mRecyclerView = (RecyclerView) v.findViewById(R.id.gridview); + + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + mRecyclerView.setHasFixedSize(true); + + + mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(columns, StaggeredGridLayoutManager.VERTICAL)); + + mRecyclerView.setAdapter(new FaqViewAdapter(getActivity(), getFAQEntries())); return v; } - private void insertHtmlEntry (View v, int viewId, int stringId) { - TextView faqItem = (TextView) v.findViewById(viewId); - faqItem.setText(Html.fromHtml(getActivity().getString(stringId))); - faqItem.setMovementMethod(LinkMovementMethod.getInstance()); + /* I think the problem mentioned in there should not affect, 4.3+ */ + private int[][] getFAQEntries() { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + int[][] newFaqItems = new int[faqitems.length - 1][2]; + int j=0; + for (int i = 0;i < faqitems.length;i++) { + if (faqitems[i][0] != R.string.broken_images) { + newFaqItems[j] = faqitems[i]; + j++; + } + } + return newFaqItems; - } + } else { + return faqitems; + } + } } diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/FaqViewAdapter.java b/main/src/main/java/de/blinkt/openvpn/fragments/FaqViewAdapter.java new file mode 100644 index 00000000..f667d798 --- /dev/null +++ b/main/src/main/java/de/blinkt/openvpn/fragments/FaqViewAdapter.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2012-2014 Arne Schwabe + * Distributed under the GNU GPL v2. For full terms see the file doc/LICENSE.txt + */ + +package de.blinkt.openvpn.fragments; + +import android.content.Context; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.text.Html; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import de.blinkt.openvpn.R; + +import static android.support.v7.widget.RecyclerView.ViewHolder; + +public class FaqViewAdapter extends RecyclerView.Adapter { + private final int[][] mFaqItems; + private final Spanned[] mHtmlEntries; + + public FaqViewAdapter(Context context, int[][] faqItems) { + mFaqItems = faqItems; + + mHtmlEntries = new Spanned[faqItems.length]; + for (int i =0; i < faqItems.length; i++) { + mHtmlEntries[i] = Html.fromHtml(context.getString(faqItems[i][1])); + + // Add hack R.string.faq_system_dialogs_title -> R.string.faq_system_dialog_xposed + if (faqItems[i][0] == R.string.faq_system_dialogs_title) + { + Spanned xposedtext = Html.fromHtml(context.getString(R.string.faq_system_dialog_xposed)); + mHtmlEntries[i] = (Spanned) TextUtils.concat(mHtmlEntries[i], xposedtext); + } + + } + + } + + public static class FaqViewHolder extends RecyclerView.ViewHolder { + + private final CardView mView; + private final TextView mBody; + private final TextView mHead; + + public FaqViewHolder(View itemView) { + super(itemView); + + mView = (CardView) itemView; + mBody = (TextView)mView.findViewById(R.id.faq_body); + mHead = (TextView)mView.findViewById(R.id.faq_head); + mBody.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + + @Override + public FaqViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.faqcard, viewGroup, false); + return new FaqViewHolder(view); + } + + @Override + public void onBindViewHolder(FaqViewHolder faqViewHolder, int i) { + faqViewHolder.mHead.setText(mFaqItems[i][0]); + faqViewHolder.mBody.setText(mHtmlEntries[i]); + } + + @Override + public int getItemCount() { + return mFaqItems.length; + } + +} diff --git a/main/src/main/res/layout/faq.xml b/main/src/main/res/layout/faq.xml index 63ae54a9..a48dc495 100644 --- a/main/src/main/res/layout/faq.xml +++ b/main/src/main/res/layout/faq.xml @@ -4,144 +4,12 @@ ~ Distributed under the GNU GPL v2. For full terms see the file doc/LICENSE.txt --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + android:verticalSpacing="@dimen/stdpadding" + android:horizontalSpacing="@dimen/stdpadding" + /> \ No newline at end of file diff --git a/main/src/main/res/layout/faqcard.xml b/main/src/main/res/layout/faqcard.xml new file mode 100644 index 00000000..da72a33a --- /dev/null +++ b/main/src/main/res/layout/faqcard.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/main/src/main/res/values/styles.xml b/main/src/main/res/values/styles.xml index 7b26a4a7..f67a51d1 100644 --- a/main/src/main/res/values/styles.xml +++ b/main/src/main/res/values/styles.xml @@ -23,7 +23,7 @@ 10sp match_parent wrap_content - ?android:attr/textAppearanceMedium + ?android:attr/textAppearanceLarge -- cgit v1.2.3