 Issue 6296160390086656:
  Issue 2491 - Fix design elements in onboarding slides  (Closed)
    
  
    Issue 6296160390086656:
  Issue 2491 - Fix design elements in onboarding slides  (Closed) 
  | Index: mobile/android/thirdparty/org/adblockplus/browser/StartPane.java | 
| diff --git a/mobile/android/thirdparty/org/adblockplus/browser/StartPane.java b/mobile/android/thirdparty/org/adblockplus/browser/StartPane.java | 
| index b8fafcfe204dc68c1ae8d47697a464936f032492..fcd689c084f3a6fd73e9580655db1c591b41d1dd 100644 | 
| --- a/mobile/android/thirdparty/org/adblockplus/browser/StartPane.java | 
| +++ b/mobile/android/thirdparty/org/adblockplus/browser/StartPane.java | 
| @@ -17,14 +17,24 @@ | 
| package org.adblockplus.browser; | 
| +import java.io.File; | 
| +import java.io.FileOutputStream; | 
| +import java.io.IOException; | 
| +import java.io.InputStream; | 
| +import java.util.ArrayList; | 
| +import java.util.HashMap; | 
| +import java.util.List; | 
| +import java.util.Map; | 
| + | 
| import org.mozilla.gecko.R; | 
| import android.content.Context; | 
| import android.content.DialogInterface; | 
| import android.content.DialogInterface.OnKeyListener; | 
| +import android.graphics.Typeface; | 
| import android.os.Bundle; | 
| import android.support.v4.app.DialogFragment; | 
| -import android.text.Html; | 
| +import android.util.Log; | 
| import android.view.KeyEvent; | 
| import android.view.LayoutInflater; | 
| import android.view.View; | 
| @@ -41,12 +51,66 @@ public class StartPane extends DialogFragment implements OnClickListener, OnKeyL | 
| private static final String TAG = "AdblockBrowser.StartPane"; | 
| private int currentStep = 1; | 
| private static final int NUMBER_OF_STEPS = 3; | 
| + private static final HashMap<String, Integer> FONTS = new HashMap<String, Integer>(); | 
| + private HashMap<String, Typeface> loadedFonts = new HashMap<String, Typeface>(); | 
| + | 
| + static | 
| + { | 
| + FONTS.put("ttf_opensans_light", R.raw.opensans_light); | 
| + FONTS.put("ttf_opensans_semibold", R.raw.opensans_semibold); | 
| + } | 
| + | 
| + static Typeface typefaceFromResource(final Context context, final int resId) | 
| + { | 
| + Typeface ret = null; | 
| + try | 
| + { | 
| + context.getCacheDir().mkdir(); | 
| + final File output = File.createTempFile("abb_font", ".ttf"); | 
| + final byte[] buffer = new byte[4096]; | 
| + final InputStream in = context.getResources().openRawResource(resId); | 
| + final FileOutputStream out = new FileOutputStream(output); | 
| + for (;;) | 
| + { | 
| + final int read = in.read(buffer); | 
| + if (read < 0) | 
| + { | 
| + break; | 
| + } | 
| + out.write(buffer, 0, read); | 
| + } | 
| + in.close(); | 
| + out.close(); | 
| + ret = Typeface.createFromFile(output); | 
| + output.delete(); | 
| + } | 
| + catch (IOException e) | 
| + { | 
| + Log.e(TAG, "Failed to load typeface: " + e.getMessage(), e); | 
| + } | 
| + return ret; | 
| + } | 
| + | 
| + private void loadTypefaces() | 
| + { | 
| + final Context context = this.getActivity(); | 
| + this.loadedFonts.clear(); | 
| + for (Map.Entry<String, Integer> e : FONTS.entrySet()) | 
| + { | 
| + final Typeface t = typefaceFromResource(context, e.getValue().intValue()); | 
| + if (t != null) | 
| + { | 
| + this.loadedFonts.put(e.getKey(), t); | 
| + } | 
| + } | 
| + } | 
| @Override | 
| public void onCreate(Bundle savedInstanceState) | 
| { | 
| super.onCreate(savedInstanceState); | 
| this.setStyle(DialogFragment.STYLE_NO_TITLE, 0); | 
| + this.loadTypefaces(); | 
| } | 
| @Override | 
| @@ -54,7 +118,6 @@ public class StartPane extends DialogFragment implements OnClickListener, OnKeyL | 
| { | 
| final View view = inflater.inflate(R.layout.abb_start_pane, container, false); | 
| - this.setTextViewTextHtml(view, R.id.abb_app_title, "Adblock <b>Browser</b>"); | 
| this.updateContents(view); | 
| this.getDialog().setOnKeyListener(this); | 
| @@ -101,6 +164,27 @@ public class StartPane extends DialogFragment implements OnClickListener, OnKeyL | 
| return false; | 
| } | 
| + private static List<View> listViews(final View parent) | 
| + { | 
| + final List<View> views = new ArrayList<View>(); | 
| + listViews(parent, views); | 
| + return views; | 
| + } | 
| + | 
| + private static void listViews(final View parent, final List<View> views) | 
| + { | 
| + views.add(parent); | 
| + if (parent instanceof ViewGroup) | 
| + { | 
| + final ViewGroup vg = (ViewGroup) parent; | 
| + final int childCount = vg.getChildCount(); | 
| + for (int i = 0; i < childCount; i++) | 
| + { | 
| + listViews(vg.getChildAt(i), views); | 
| + } | 
| + } | 
| + } | 
| + | 
| private void updateContents(final View view) | 
| { | 
| final LinearLayout ll = (LinearLayout) view.findViewById(R.id.abb_main_content); | 
| @@ -117,12 +201,27 @@ public class StartPane extends DialogFragment implements OnClickListener, OnKeyL | 
| this.getResources().getIdentifier("abb_frp_button_" + this.currentStep, | 
| "string", | 
| this.getActivity().getPackageName())); | 
| - } | 
| - private void setTextViewTextHtml(final View view, final int viewId, final String text) | 
| - { | 
| - final TextView tv = (TextView) view.findViewById(viewId); | 
| - tv.setText(Html.fromHtml(text)); | 
| + final List<View> views = listViews(view); | 
| + for (View v : views) | 
| + { | 
| + final Object tag = v.getTag(); | 
| + if (tag != null) | 
| 
Felix Dahlke
2015/05/22 11:50:57
Shouldn't we also check that the tags starts with
 
René Jeschke
2015/05/22 12:04:44
We are matching non-null tags against the font has
 
Felix Dahlke
2015/05/22 12:09:57
Yeah true.
 | 
| + { | 
| + Typeface t = this.loadedFonts.get(tag.toString()); | 
| + if (t != null) | 
| + { | 
| + if (v instanceof TextView) | 
| + { | 
| + ((TextView) v).setTypeface(t); | 
| + } | 
| + else if (v instanceof Button) | 
| + { | 
| + ((Button) v).setTypeface(t); | 
| + } | 
| + } | 
| + } | 
| + } | 
| } | 
| private void setButtonText(final View view, final int viewId, final int resId) |