Security News
pnpm 10.0.0 Blocks Lifecycle Scripts by Default
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
com.github.skydoves:needs
Advanced tools
An easy way to implement modern permission instructions popup.
An easy way to implement modern permission instructions popup.
Needs can be fully customized and showing with animations.
Add below codes to your root build.gradle
file (not your module build.gradle file).
allprojects {
repositories {
jcenter()
}
}
And add a dependency code to your module's build.gradle
file.
dependencies {
implementation "com.github.skydoves:needs:1.1.2"
}
This is a basic example on a screenshot. Here is how to create Needs
using Needs.Builder
.
Needs needs = new Needs.Builder(context)
.setTitle("Permission instructions for using this Android app.")
.addNeedsItem(new NeedsItem(null, "· SD Card", "(Required)", "Access photos, media, and files on device."))
.addNeedsItem(new NeedsItem(null, "· Location", "(Required)", "Access this device's location."))
.addNeedsItem(new NeedsItem(null, "· Camera", "(Optional)", "Take pictures and record video."))
.addNeedsItem(new NeedsItem(null, "· Contact", "(Optional)", "Access this device's contacts."))
.addNeedsItem(new NeedsItem(null, "· SMS", "(Optional)", " end and view SMS messages."))
.setDescription("The above accesses are used to better serve you.")
.setConfirm("Confirm")
.setBackgroundAlpha(0.6f)
.setLifecycleOwner(lifecycleOwner)
.build();
This is how to create Needs
's instance using kotlin dsl.
val needs = createNeeds(baseContext) {
titleIcon = iconDrawable
title = "Permission instructions \nfor using this Android app."
titleTextForm = titleForm
addNeedsItem(NeedsItem(drawable_sd, "SD Card", "(Required)", "Access photos, media, and files on device."))
addNeedsItem(NeedsItem(drawable_location, "Location", "(Required)", "Access this device's location."))
addNeedsItem(NeedsItem(drawable_camera, "Camera", "(Optional)", "Take pictures and record video."))
addNeedsItem(NeedsItem(drawable_contact, "Contact", "(Optional)", "Access this device's contacts."))
addNeedsItem(NeedsItem(drawable_sms, "SMS", "(Optional)", "Send and view SMS messages."))
description = "The above accesses are used to better serve you."
confirm = "Confirm"
backgroundAlpha = 0.6f
lifecycleOwner = lifecycle
needsTheme = theme
needsItemTheme = itemTheme
needsAnimation = NeedsAnimation.CIRCULAR
}
We can listen to the confirm button is clicked using OnConfirmListener
.
needs.setOnConfirmListener(new OnConfirmListener() {
@Override
public void onConfirm() {
// confirmed
}
});
Here is how to show needs popup and dismiss easily.
needs.show(layout); // shows the popup menu to the center.
needs.dismiss(); // dismiss the popup menu.
TextFrom is an attribute class that has some attributes about TextView for customizing popup texts.
TextForm textForm = new TextForm.Builder()
.setTextColor(R.color.colorPrimary)
.setTextSize(14)
.setTextStyle(Typeface.BOLD)
.build();
builder.setTitleTextForm(titleTextForm);
builder.setDescriptionTextForm(descriptionTextForm);
builder.setConfirmTextForm(confirmTextForm);
Here is how to create TextForm
using kotlin dsl.
val titleForm = textForm {
textSize = 18
textStyle = Typeface.BOLD
textColor = ContextCompat.getColor(baseContext, R.color.black)
}
NeedsTheme is an attribute class for changing Needs
popup theme easily.
NeedsTheme needsTheme = new NeedsTheme.Builder(context)
.setBackgroundColor(ContextCompat.getColor(context, R.color.background))
.setTitleTextForm(titleTextForm)
.setDescriptionTextForm(descriptionTextForm)
.setConfirmTextForm(confirmTextForm)
.build();
builder.setNeedsTheme(needsTheme);
Here is how to create NeedsTheme
using kotlin dsl.
val theme = needsTheme(baseContext) {
backgroundColor = ContextCompat.getColor(baseContext, R.color.background)
titleTextForm = textForm(baseContext) {
textSize = 18
textColor = ContextCompat.getColor(baseContext, R.color.white)
}
descriptionTextForm = textForm(baseContext) {
textSize = 12
textColor = ContextCompat.getColor(baseContext, R.color.description)
}
}
NeedsTheme
is an attribute class for changing Needs
popup RecyclerView's item theme easily.
NeedsItemTheme needsItemTheme = new NeedsItemTheme.Builder(context)
.setBackgroundColor(ContextCompat.getColor(context, R.color.background))
.setTitleTextForm(titleTextForm)
.setRequireTextForm(requireTextForm)
.setBulletForm(bulletForm)
.build();
builder.setNeedsItemTheme(needsItemTheme);
Here is how to create NeedsItemTheme
using kotlin dsl.
val itemTheme = needsItemTheme(baseContext) {
backgroundColor = ContextCompat.getColor(baseContext, R.color.background)
titleTextForm = textForm(baseContext) {
textColor = ContextCompat.getColor(baseContext, R.color.colorPrimaryDark)
textSize = 16
}
descriptionTextForm = textForm(baseContext) {
textColor = ContextCompat.getColor(baseContext, R.color.description)
}
}
We can make bullet points in front of every title and they can be fully customized.
BulletForm bulletForm = new BulletForm.Builder(context)
.setBulletColorResource(R.color.colorPrimary)
.setBulletSize(12)
.setBulletPadding(9)
.build();
Here is how to create BulletForm
using kotlin dsl.
val bulletForm = bulletForm(context) {
setBulletColorResource(R.color.colorPrimary)
setBulletSize(12)
}
NeedsAnimation implements showing and dismissing popup with animations.
ELASTIC | CIRCULAR |
---|---|
NONE | FADE |
---|---|
builder.setNeedsAnimation(NeedsAnimation.FADE)
builder.setNeedsAnimation(NeedsAnimation.NONE)
builder.setNeedsAnimation(NeedsAnimation.ELASTIC)
builder.setNeedsAnimation(NeedsAnimation.CIRCULAR)
We can show and initialize Needs property more polish using extensions.
Shows the popup menu to the center.
It observes the target view's inflating and after inflate finished, show up on the target view.
targetView.showNeeds(needs)
We can initialize the needs property lazily using needs
keyword and Needs.Factory abstract class.
The needs
extension keyword can be used on Activity and Fragment.
class MainActivity : AppCompatActivity() {
private val myNeeds by needs(DarkNeedsFactory::class)
// ..
}
We should create a class which extends Needs.Factory.
An implementation class of the factory must have a default(non-argument) constructor.
class DarkNeedsFactory : Needs.Factory() {
override fun create(context: Context, lifecycle: LifecycleOwner): Needs {
return Needs.Builder(context)
.setTitle("Permission instructions \nfor using this Android app.")
.setDescription("The above accesses are used to better serve you. This application is available even if you do not agree to allow it.")
.setConfirm("Confirm")
.setBackgroundAlpha(0.6f)
.setLifecycleOwner(lifecycle)
.setNeedsAnimation(NeedsAnimation.FADE)
.addNeedsItem(NeedsItem(null, "· SD Card", "(Required)", " Access photos, media, and files on device."))
.addNeedsItem(NeedsItem(null, "· Location", "(Required)", " Access this device's location."))
.addNeedsItem(NeedsItem(null, "· Camera", "(Optional)", " Take pictures and record video."))
.addNeedsItem(NeedsItem(null, "· Contact", "(Optional)", " Access this device's contacts."))
.addNeedsItem(NeedsItem(null, "· SMS", "(Optional)", " Send and view SMS messages."))
.build()
}
}
If you want to show-up the Popup only once or a specific number of times, here is how to implement it simply.
.setPreferenceName("MyNeeds") // sets preference name of the Needs.
.setShowTime(3) // show-up three of times the popup. the default value is 1 If the preference name is set.
Dialog, PopupWindow and etc.. have memory leak issue if not dismissed before activity or fragment are destroyed.
But Lifecycles are now integrated with the Support Library since Architecture Components 1.0 Stable released.
So we can solve the memory leak issue so easily.
Just use setLifecycleOwner
method. Then dismiss
method will be called automatically before activity or fragment would be destroyed.
.setLifecycleOwner(lifecycleOwner)
.setTitleIcon(@DrawableRes drawable: Drawable)
.setTitle(value: String)
.setTitleTextForm(value: TextForm)
.setDescription(value: String)
.setDescriptionTextForm(value: TextForm)
.setConfirmBackgroundColor(@ColorInt value: Int)
.setConfirm(value: String)
.setConfirmTextForm(value: TextForm)
.setConfirmVisible(value: Boolean)
.setListAdapter(value: RecyclerView.Adapter<*>)
.setListHeight(value: Int)
.setPadding(value: Int)
.addNeedsItem(value: NeedsItem)
.addNeedsItemList(value: List<NeedsItem>)
.setBackground(@DrawableRes value: Drawable)
.setBackgroundColor(@ColorInt value: Int)
.setBackgroundAlpha(value: Float)
.setDividerColor(@ColorInt value: Int)
.setDividerVisible(value: Boolean)
.setDividerHeight(value: Float)
.setOnConfirmListener(value: OnConfirmListener)
.setLifecycleOwner(value: LifecycleOwner)
.setNeedsTheme(value: NeedsTheme)
.setNeedsItemTheme(value: NeedsItemTheme)
.setNeedsAnimation(value: NeedsAnimation)
Support it by joining stargazers for this repository. :star:
Copyright 2019 skydoves
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
FAQs
An easy way to implement modern permission instructions popup.
We found that com.github.skydoves:needs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.