From 9094c98ca42f4821846544c77e98b0163e2f1a65 Mon Sep 17 00:00:00 2001 From: TheKhaeng Date: Tue, 24 Jan 2017 11:18:40 +0700 Subject: [PATCH 1/9] First commit to fork update Plan: [+] Add more dynamic attributes [+] Can add font [+] Add Left button [+] Fix bug ( ex. Cannot work with selector ) [+] Change some code that deprecate [+] Fix call get position in adapter [+] add ActivityExample2 --- .gitignore | 42 ++++++++++++++++++++++++ app/build.gradle | 12 +++---- build.gradle | 5 +-- gradle/wrapper/gradle-wrapper.properties | 4 +-- pinlockview/build.gradle | 18 +++++----- 5 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ac2e8c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +lt application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml +.idea/ + +# Keystore files +*.jks + + diff --git a/app/build.gradle b/app/build.gradle index b01b2bb4..1ff45f71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { applicationId "com.andrognito.pinlockviewapp" - minSdkVersion 11 - targetSdkVersion 23 + minSdkVersion 17 + targetSdkVersion 25 versionCode 1 versionName "1.0" } @@ -20,8 +20,8 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.4.0' compile project(':pinlockview') } diff --git a/build.gradle b/build.gradle index 530965f1..408c8d30 100644 --- a/build.gradle +++ b/build.gradle @@ -5,9 +5,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -15,6 +15,7 @@ buildscript { allprojects { repositories { + mavenCentral() jcenter() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 122a0dca..2b562dc6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Tue Jan 24 11:08:30 ICT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/pinlockview/build.gradle b/pinlockview/build.gradle index 45c70814..bbe61352 100644 --- a/pinlockview/build.gradle +++ b/pinlockview/build.gradle @@ -26,12 +26,12 @@ ext { android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { - minSdkVersion 11 - targetSdkVersion 23 + minSdkVersion 17 + targetSdkVersion 25 versionCode 1 versionName "1.0" } @@ -45,10 +45,10 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.4.0' - compile 'com.android.support:recyclerview-v7:23.4.0' + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.1.0' + compile 'com.android.support:recyclerview-v7:25.1.0' } -apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' -apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' \ No newline at end of file From 91741e40ae13d613b908ca1d6deb934517c4ff5b Mon Sep 17 00:00:00 2001 From: TheKhaeng Date: Tue, 24 Jan 2017 11:20:49 +0700 Subject: [PATCH 2/9] [+] add more attribute to CustomizationOptionsBundle + change drawable to use resId (fix bug to use selector) --- .../CustomizationOptionsBundle.java | 68 +++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/pinlockview/src/main/java/com/andrognito/pinlockview/CustomizationOptionsBundle.java b/pinlockview/src/main/java/com/andrognito/pinlockview/CustomizationOptionsBundle.java index 63eee73e..41246f12 100644 --- a/pinlockview/src/main/java/com/andrognito/pinlockview/CustomizationOptionsBundle.java +++ b/pinlockview/src/main/java/com/andrognito/pinlockview/CustomizationOptionsBundle.java @@ -5,7 +5,7 @@ /** * The customization options for the buttons in {@link PinLockView} * passed to the {@link PinLockAdapter} to decorate the individual views - * + *

* Created by aritraroy on 01/06/16. */ public class CustomizationOptionsBundle { @@ -13,12 +13,19 @@ public class CustomizationOptionsBundle { private int textColor; private int textSize; private int buttonSize; - private Drawable buttonBackgroundDrawable; + private int buttonBackgroundId; private Drawable deleteButtonDrawable; private int deleteButtonSize; private boolean showDeleteButton; private int deleteButtonPressesColor; + private boolean autoHideDeleteButton; + private boolean showLeftButton; + private String leftButtonText; + private int leftButtonTextSize; + private String textFontName; + private boolean vibrateButtonClick; + public CustomizationOptionsBundle() { } @@ -46,12 +53,12 @@ public void setButtonSize(int buttonSize) { this.buttonSize = buttonSize; } - public Drawable getButtonBackgroundDrawable() { - return buttonBackgroundDrawable; + public int getButtonBackgroundId() { + return buttonBackgroundId; } - public void setButtonBackgroundDrawable(Drawable buttonBackgroundDrawable) { - this.buttonBackgroundDrawable = buttonBackgroundDrawable; + public void setButtonBackgroundId(int buttonBackgroundId) { + this.buttonBackgroundId = buttonBackgroundId; } public Drawable getDeleteButtonDrawable() { @@ -85,4 +92,53 @@ public int getDeleteButtonPressesColor() { public void setDeleteButtonPressesColor(int deleteButtonPressesColor) { this.deleteButtonPressesColor = deleteButtonPressesColor; } + + public boolean isAutoHideDeleteButton() { + return autoHideDeleteButton; + } + + public void setAutoHideDeleteButton(boolean autoHideDeleteButton) { + this.autoHideDeleteButton = autoHideDeleteButton; + } + + public boolean isShowLeftButton() { + return showLeftButton; + } + + public void setShowLeftButton(boolean showLeftButton) { + this.showLeftButton = showLeftButton; + } + + public String getLeftButtonText() { + return leftButtonText; + } + + public void setLeftButtonText(String leftButtonText) { + this.leftButtonText = leftButtonText; + } + + public int getLeftButtonTextSize() { + return leftButtonTextSize; + } + + public void setLeftButtonTextSize(int leftButtonTextSize) { + this.leftButtonTextSize = leftButtonTextSize; + } + + public String getTextFontName() { + return textFontName; + } + + public void setTextFontName(String textFontName) { + this.textFontName = textFontName; + } + + + public boolean isVibrateButtonClick() { + return vibrateButtonClick; + } + + public void setVibrateButtonClick(boolean vibrateButtonClick) { + this.vibrateButtonClick = vibrateButtonClick; + } } From 69e3a09c84c57941983082a12378559926af1c10 Mon Sep 17 00:00:00 2001 From: TheKhaeng Date: Tue, 24 Jan 2017 11:24:23 +0700 Subject: [PATCH 3/9] [+] add new LeftButtonlayout + fix bug + add vibrate touch + add left button + add find font --- .../pinlockview/LeftButtonClickListener.java | 12 ++ .../pinlockview/PinLockAdapter.java | 169 ++++++++++++++---- .../andrognito/pinlockview/ResourceUtils.java | 58 ++++++ .../res/layout/layout_left_button_item.xml | 16 ++ 4 files changed, 219 insertions(+), 36 deletions(-) create mode 100755 pinlockview/src/main/java/com/andrognito/pinlockview/LeftButtonClickListener.java create mode 100755 pinlockview/src/main/res/layout/layout_left_button_item.xml diff --git a/pinlockview/src/main/java/com/andrognito/pinlockview/LeftButtonClickListener.java b/pinlockview/src/main/java/com/andrognito/pinlockview/LeftButtonClickListener.java new file mode 100755 index 00000000..abf9e90d --- /dev/null +++ b/pinlockview/src/main/java/com/andrognito/pinlockview/LeftButtonClickListener.java @@ -0,0 +1,12 @@ +package com.andrognito.pinlockview; + +/** + * The listener that triggers callbacks for various events + * in the {@link PinLockView} + *

+ * Created by TheKhaeng on 23/01/17. + */ +public interface LeftButtonClickListener{ + + void onLeftButtonClicked( PinLockAdapter.LeftButtonViewHolder numberViewHolder ); +} diff --git a/pinlockview/src/main/java/com/andrognito/pinlockview/PinLockAdapter.java b/pinlockview/src/main/java/com/andrognito/pinlockview/PinLockAdapter.java index 223f95c0..97a0f2e5 100644 --- a/pinlockview/src/main/java/com/andrognito/pinlockview/PinLockAdapter.java +++ b/pinlockview/src/main/java/com/andrognito/pinlockview/PinLockAdapter.java @@ -3,9 +3,10 @@ import android.content.Context; import android.graphics.PorterDuff; import android.graphics.Rect; -import android.os.Build; +import android.os.Vibrator; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; +import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -19,42 +20,89 @@ */ public class PinLockAdapter extends RecyclerView.Adapter { + public static final int DEFAULT_VIBRATE_CLICK = 50; + private static final int VIEW_TYPE_NUMBER = 0; private static final int VIEW_TYPE_DELETE = 1; + private static final int VIEW_TYPE_LEFT_BUTTON = 2; + private final Vibrator vibrator; private Context mContext; private CustomizationOptionsBundle mCustomizationOptionsBundle; private OnNumberClickListener mOnNumberClickListener; private OnDeleteClickListener mOnDeleteClickListener; + private OnLeftButtonClickListener mOnLeftButtonClickListener; private int mPinLength; public PinLockAdapter(Context context) { this.mContext = context; + this.vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + } + + @Override + public int getItemCount() { + return 12; + } + + @Override + public int getItemViewType(int position) { + if (position == 10 - 1) { + return VIEW_TYPE_LEFT_BUTTON; + } + if (position == getItemCount() - 1) { + return VIEW_TYPE_DELETE; + } + return VIEW_TYPE_NUMBER; } + @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - RecyclerView.ViewHolder viewHolder; LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - if (viewType == VIEW_TYPE_NUMBER) { - View view = inflater.inflate(R.layout.layout_number_item, parent, false); - viewHolder = new NumberViewHolder(view); - } else { + RecyclerView.ViewHolder viewHolder; + if (viewType == VIEW_TYPE_LEFT_BUTTON) { + View view = inflater.inflate(R.layout.layout_left_button_item, parent, false); + viewHolder = new LeftButtonViewHolder(view); + } else if (viewType == VIEW_TYPE_DELETE) { View view = inflater.inflate(R.layout.layout_delete_item, parent, false); viewHolder = new DeleteViewHolder(view); + } else { + View view = inflater.inflate(R.layout.layout_number_item, parent, false); + viewHolder = new NumberViewHolder(view); } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - if (holder.getItemViewType() == VIEW_TYPE_NUMBER) { - NumberViewHolder vh1 = (NumberViewHolder) holder; - configureNumberButtonHolder(vh1, position); + if (holder.getItemViewType() == VIEW_TYPE_LEFT_BUTTON) { + LeftButtonViewHolder vh1 = (LeftButtonViewHolder) holder; + configureLeftButtonHolder(vh1); + } else if (holder.getItemViewType() == VIEW_TYPE_NUMBER) { + NumberViewHolder vh2 = (NumberViewHolder) holder; + configureNumberButtonHolder(vh2, position); } else if (holder.getItemViewType() == VIEW_TYPE_DELETE) { - DeleteViewHolder vh2 = (DeleteViewHolder) holder; - configureDeleteButtonHolder(vh2); + DeleteViewHolder vh3 = (DeleteViewHolder) holder; + configureDeleteButtonHolder(vh3); + } + } + + private void configureLeftButtonHolder(LeftButtonViewHolder holder) { + if (mCustomizationOptionsBundle.isShowLeftButton()) { + holder.mLeftButton.setVisibility(View.VISIBLE); + } else { + holder.mLeftButton.setVisibility(View.GONE); + } + + if (mCustomizationOptionsBundle != null) { + holder.mLeftButton.setTextColor(mCustomizationOptionsBundle.getTextColor()); + holder.mLeftButton.setText(mCustomizationOptionsBundle.getLeftButtonText()); + holder.mLeftButton.setTypeface(ResourceUtils.findFont( + mContext, + mCustomizationOptionsBundle.getTextFontName(), + null)); + holder.mLeftButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCustomizationOptionsBundle.getLeftButtonTextSize()); } } @@ -70,14 +118,14 @@ private void configureNumberButtonHolder(NumberViewHolder holder, int position) if (mCustomizationOptionsBundle != null) { holder.mNumberButton.setTextColor(mCustomizationOptionsBundle.getTextColor()); - if (mCustomizationOptionsBundle.getButtonBackgroundDrawable() != null) { - if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { - holder.mNumberButton.setBackgroundDrawable(mCustomizationOptionsBundle.getButtonBackgroundDrawable()); - } else { - holder.mNumberButton.setBackground(mCustomizationOptionsBundle.getButtonBackgroundDrawable()); - } + if (mCustomizationOptionsBundle.getButtonBackgroundId() != 0) { + holder.mNumberButton.setBackgroundResource(mCustomizationOptionsBundle.getButtonBackgroundId()); } holder.mNumberButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCustomizationOptionsBundle.getTextSize()); + holder.mNumberButton.setTypeface(ResourceUtils.findFont( + mContext, + mCustomizationOptionsBundle.getTextFontName(), + null)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mCustomizationOptionsBundle.getButtonSize(), mCustomizationOptionsBundle.getButtonSize()); holder.mNumberButton.setLayoutParams(params); } @@ -86,7 +134,8 @@ private void configureNumberButtonHolder(NumberViewHolder holder, int position) private void configureDeleteButtonHolder(DeleteViewHolder holder) { if (holder != null) { - if (mCustomizationOptionsBundle.isShowDeleteButton() && mPinLength > 0) { + if (mCustomizationOptionsBundle.isShowDeleteButton() + && (mPinLength > 0 || !mCustomizationOptionsBundle.isAutoHideDeleteButton())) { holder.mButtonImage.setVisibility(View.VISIBLE); if (mCustomizationOptionsBundle.getDeleteButtonDrawable() != null) { holder.mButtonImage.setImageDrawable(mCustomizationOptionsBundle.getDeleteButtonDrawable()); @@ -100,18 +149,6 @@ private void configureDeleteButtonHolder(DeleteViewHolder holder) { } } - @Override - public int getItemCount() { - return 12; - } - - @Override - public int getItemViewType(int position) { - if (position == getItemCount() - 1) { - return VIEW_TYPE_DELETE; - } - return VIEW_TYPE_NUMBER; - } public int getPinLength() { return mPinLength; @@ -137,6 +174,14 @@ public void setOnDeleteClickListener(OnDeleteClickListener onDeleteClickListener this.mOnDeleteClickListener = onDeleteClickListener; } + public OnLeftButtonClickListener getOnLeftButtonClickListener() { + return mOnLeftButtonClickListener; + } + + public void setOnLeftButtonClickListener(OnLeftButtonClickListener onLeftButtonClickListener) { + this.mOnLeftButtonClickListener = onLeftButtonClickListener; + } + public CustomizationOptionsBundle getCustomizationOptions() { return mCustomizationOptionsBundle; } @@ -145,6 +190,35 @@ public void setCustomizationOptions(CustomizationOptionsBundle customizationOpti this.mCustomizationOptionsBundle = customizationOptionsBundle; } + public class LeftButtonViewHolder extends RecyclerView.ViewHolder { + Button mLeftButton; + + public LeftButtonViewHolder(final View itemView) { + super(itemView); + mLeftButton = (Button) itemView.findViewById(R.id.button); + mLeftButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnLeftButtonClickListener != null) { + mOnLeftButtonClickListener.onLeftButtonClicked(LeftButtonViewHolder.this); + } + } + }); + + mLeftButton.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if( mCustomizationOptionsBundle.isVibrateButtonClick()){ + mLeftButton.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); + } + } + return false; + } + }); + } + } + public class NumberViewHolder extends RecyclerView.ViewHolder { Button mNumberButton; @@ -155,13 +229,26 @@ public NumberViewHolder(final View itemView) { @Override public void onClick(View v) { if (mOnNumberClickListener != null) { - mOnNumberClickListener.onNumberClicked(getAdapterPosition()); + mOnNumberClickListener.onNumberClicked(NumberViewHolder.this); } } }); + + mNumberButton.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if( mCustomizationOptionsBundle.isVibrateButtonClick()){ + mNumberButton.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); + } + } + return false; + } + }); } } + public class DeleteViewHolder extends RecyclerView.ViewHolder { LinearLayout mDeleteButton; ImageView mButtonImage; @@ -195,15 +282,21 @@ public boolean onLongClick(View v) { @Override public boolean onTouch(View v, MotionEvent event) { - if(event.getAction() == MotionEvent.ACTION_DOWN){ + if (event.getAction() == MotionEvent.ACTION_DOWN) { mButtonImage.setColorFilter(mCustomizationOptionsBundle.getDeleteButtonPressesColor()); + if( mCustomizationOptionsBundle.isVibrateButtonClick()){ + mDeleteButton.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); + } rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); } - if(event.getAction() == MotionEvent.ACTION_UP){ + if (event.getAction() == MotionEvent.ACTION_UP) { mButtonImage.clearColorFilter(); } - if(event.getAction() == MotionEvent.ACTION_MOVE){ - if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){ + if (event.getAction() == MotionEvent.ACTION_CANCEL) { + mButtonImage.clearColorFilter(); + } + if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())) { mButtonImage.clearColorFilter(); } } @@ -214,7 +307,11 @@ public boolean onTouch(View v, MotionEvent event) { } public interface OnNumberClickListener { - void onNumberClicked(int position); + void onNumberClicked(NumberViewHolder numberViewHolder); + } + + public interface OnLeftButtonClickListener { + void onLeftButtonClicked(LeftButtonViewHolder numberViewHolder); } public interface OnDeleteClickListener { diff --git a/pinlockview/src/main/java/com/andrognito/pinlockview/ResourceUtils.java b/pinlockview/src/main/java/com/andrognito/pinlockview/ResourceUtils.java index 57d7016b..267455bc 100644 --- a/pinlockview/src/main/java/com/andrognito/pinlockview/ResourceUtils.java +++ b/pinlockview/src/main/java/com/andrognito/pinlockview/ResourceUtils.java @@ -1,16 +1,28 @@ package com.andrognito.pinlockview; import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.support.annotation.ColorRes; import android.support.annotation.DimenRes; import android.support.annotation.DrawableRes; import android.support.v4.content.ContextCompat; +import android.text.TextUtils; +import android.util.Log; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; /** * Created by aritraroy on 10/06/16. */ public class ResourceUtils { + private final static String TAG = ResourceUtils.class.getSimpleName(); + + private static Map cachedFontMap = new HashMap(); private ResourceUtils() { throw new AssertionError(); @@ -27,4 +39,50 @@ public static float getDimensionInPx(Context context, @DimenRes int id) { public static Drawable getDrawable(Context context, @DrawableRes int id) { return ContextCompat.getDrawable(context, id); } + + public static Typeface findFont(Context context, String fontPath, String defaultFontPath) { + + if (fontPath == null) { + return Typeface.DEFAULT; + } + + String fontName = new File(fontPath).getName(); + String defaultFontName = ""; + if (!TextUtils.isEmpty(defaultFontPath)) { + defaultFontName = new File(defaultFontPath).getName(); + } + + if (cachedFontMap.containsKey(fontName)) { + return cachedFontMap.get(fontName); + } else { + try { + AssetManager assets = context.getResources().getAssets(); + + if (Arrays.asList(assets.list("")).contains(fontPath)) { + Typeface typeface = Typeface.createFromAsset(context.getAssets(), fontName); + cachedFontMap.put(fontName, typeface); + return typeface; + } else if (Arrays.asList(assets.list("fonts")).contains(fontName)) { + Typeface typeface = Typeface.createFromAsset(context.getAssets(), String.format("fonts/%s", fontName)); + cachedFontMap.put(fontName, typeface); + return typeface; + } else if (Arrays.asList(assets.list("iconfonts")).contains(fontName)) { + Typeface typeface = Typeface.createFromAsset(context.getAssets(), String.format("iconfonts/%s", fontName)); + cachedFontMap.put(fontName, typeface); + return typeface; + } else if (!TextUtils.isEmpty(defaultFontPath) && Arrays.asList(assets.list("")).contains(defaultFontPath)) { + Typeface typeface = Typeface.createFromAsset(context.getAssets(), defaultFontPath); + cachedFontMap.put(defaultFontName, typeface); + return typeface; + } else { + throw new Exception("Font not Found"); + } + + } catch (Exception e) { + Log.e(TAG, String.format("Unable to find %s font. Using Typeface.DEFAULT instead.", fontName)); + cachedFontMap.put(fontName, Typeface.DEFAULT); + return Typeface.DEFAULT; + } + } + } } diff --git a/pinlockview/src/main/res/layout/layout_left_button_item.xml b/pinlockview/src/main/res/layout/layout_left_button_item.xml new file mode 100755 index 00000000..e0934790 --- /dev/null +++ b/pinlockview/src/main/res/layout/layout_left_button_item.xml @@ -0,0 +1,16 @@ + + + +