Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

PasscodeView

If you need a Passcode view (like PIN code or iOS Passcode) then there's a good widget. The basic concept is a library that contains two seperated views.

1.) PasscodeView

This is a full customizable numeric pad interface. Easy to use for lock screen, PIN pad, login or other security reason. You can add new button or change the button style using PasscodeBaseAdapter.

2.) PasscodeIndicator

An simple indicator view to feedback for user when type on the PasscodeView. You can place anywhere in the layout XML independent PasscodeView. It is also highly customizable with XML attributes like padding, margin, default or active drawable and of course animation.

Screenshots

Demo


Usage

Download

As library project

There is enough to download only the passcodeview-library which contains all neccessary files.

As Gradle dependency

The AAR file is available using by JitPack. So you need to edit the gradle files and run gradle sync.

Add it in your root build.gradle at the end of repositories:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

Add the dependency at the end of your /app/build.gradle files:

dependencies {
compile 'com.github.siczmj:passcodeview:v1.0.1'
}

Add PasscodeView to your XML layout

<com.nirigo.mobile.view.passcode.PasscodeView
android:id="@+id/passcode_view"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>

Wrap mode or Stretch mode

The PasscodeView working as auto wrapping mode and stretch mode too. What does it mean? In wrap mode the PasscodeView measure self by children sizes. It's good when you set the buttons size wrap_content or any exact size. In this case you need to use appropriate inflater in getView() implementation. See any example of PasscodeViewAdapter. If you set the layout_width and/or layout_height of PasscodeView to match_parent or exact size then will be stretch each child with equal size. So, in this case not matter what is the size of the children.

Implement PasscodeBaseAdapter ...

publicclassCustomPasscodeAdapterextendsPasscodeBaseAdapter {
privateLayoutInflaterinflater;
publicCustomPasscodeAdapter(Contextcontext) {
super(Arrays.asList(
newPasscodeItem("1", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("2", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("3", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("4", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("5", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("6", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("7", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("8", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("9", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("X", PasscodeItem.TYPE_CLEAR),
newPasscodeItem("0", PasscodeItem.TYPE_NUMBER),
newPasscodeItem("<", PasscodeItem.TYPE_REMOVE)
));
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroupparent) {
PasscodeItemitem = getItem(position);
if(convertView == null || convertView.getTag() != PasscodeItem.class){
convertView = inflater.inflate(R.layout.button_passcode_custom, parent, false);
convertView.setTag(PasscodeItem.class);
}
AppCompatButtonbutton = (AppCompatButton) convertView;
button.setText(item.getValue());
button.setVisibility(item.getType() == PasscodeItem.TYPE_EMPTY ? View.INVISIBLE : View.VISIBLE);
returnconvertView;
}
}

... then make an instance and set it!

CustomPasscodeAdapteradapter = newCustomPasscodeAdapter(getActivity());
passcodeView.setAdapter(adapter);

Add the PasscodeIndicator to your XML layout

Add the passcode xml namespace to access all custom attributes:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:passcode="http://schemas.android.com/apk/res-auto"
...

Add the indicator to xml and give the appearance parameters:

<com.nirigo.mobile.view.passcode.PasscodeIndicator
android:id="@+id/passcode_indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="24dp"android:layout_marginTop="24dp"passcode:indicator_background="@color/custom_gray"passcode:indicator_background_active="@color/custom_green"passcode:indicator_length="6"passcode:indicator_level="2"passcode:indicator_margin="7dp"passcode:indicator_size="12dp"passcode:indicator_animation="@anim/custom_indicator_animation"
/>

How to set the level in the indicator?

The indicator it's just a feedback for users so exactly not matter what indicate. That mean you need to set the indicator level only and you want to use anything.

passcodeIndicator.setIndicatorLevel(yourCurrentPasscode.length());

Animate when something wrong

passcodeIndicator.wrongPasscode();

In this case the default animation will be shake all indicator drawables. See the demo.


Tips & Tricks

How to add custom buttons and actions to PasscodeView?

It's really easy. You can see the example in the Android implementation:

  1. You need to extends the PasscodeItem model and add the new parameters. Like PasscodeItemAndroid and PasscodeItemAndroidImage in the models package of example project.

  2. Make new adapter that use your unique PasscodeItems. Like AndroidPasscodeAdapter.

  3. Handle it in the getView() implementation and pass your custom layout. Like in the AndroidPasscodeAdapter.getView() I added Enter event with ImageView

  4. Catch the onItemClick and hanle the custom event. like in the ExampleAndroidFragment, check Enter event.

Can I use any drawable/mipmap/color on indicator?

Yes.

What mean the type in the PasscodeItem?

Type member can help you seperate View type or action type.

FieldValueExplain
TYPE_EMPTY-1Use if you want to hide an View.
TYPE_NUMBER0Typical mean dial number.
TYPE_REMOVE1Backspace or remove last character.
TYPE_CLEAR2Clear all text.
TYPE_ENTER3Send previously typed characters.

Samples

There are follow samples available:

  1. Plain usage:

    • ExamplePlainFragment.java
  2. Customization example:

    • ExampleCustomizedFragment.java
    • CustomPasscodeAdapter.java
  3. IOS look example:

    • ExampleIOSFragment.java
    • PasscodeItemIOS.java
    • IOSPasscodeAdapter.java
    • ...and corresponding elements
  4. Android PIN code example:

    • ExampleAndroidFragment.java
    • PasscodeItemAndroid.java and PasscodeItemAndroidImage.java
    • AndroidPasscodeAdapter.java
    • ...and corresponding elements

TODO

  • change number of column
  • add selector support
  • add watch() method to passcodeindicator to listening EditText/Autocomplete..
  • example for imageview implementation
  • AAR in maven repo

License

See the LICENSE file in the project root.

About

PasscodeView implementation on Android.

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages