How to realize password retry counter with Jetpack Compose? - android-jetpack-compose

I would like to count the attempts entering the PIN and show notifications accordingly:
val remainingPinCounter = remember { mutableStateOf(3) }
//
if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
#Composable
private fun showWrongPinNotification(retries: MutableStateOf<Int>){
if(retries.value > 0) Log.d("TAG", "Remaining Retries := $retries.value)
else Log.d("TAG", "All $retries.value attempts failed!)
//..
}
But the showWrongPinNotification() is called continously with increasing remainingPinCounter to -infinity , although I decrement it via pinState == WRONG_PIN only?! I guess the state WRONG_PIN is not changing and thus constantly calling showWrongPinNotification with decremented values?
It worked properly without remeber ->val remainingPinCounter = 3

if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
might be the infinite recompositions if you don't change pinState before next recomposition. If that's the case on each recomposition conditional block is invoked and value of remainingPinCounter changed constantly.
LaunchedEffect(pinState) {
if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
}
Other option is to decrease it only once using LaunchedEffect as

Related

checking all (visible) layers for crossorigin-parameter and return a variable depending on it

i'm trying to receive a variable after i checked the layers of the map on their crossOrigin-Property (if given).
In fact I want to set my variable printposs=true/false.
As soon as one visible layer doesnt have the proper CrossOrigin-Value the variable should become possible=true and the function/foreach-loop can quit, returning the value "outside"
Thats what i got alreay with my poor JS-knowledge. But it seems the variable always keeps the value of the last processed layer.
JSfiddle here: http://jsfiddle.net/wa5g90xb/3/ (I added browser console-logging)
map.getLayers().forEach(function (layer, idx, a) {
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function (sublayer, jdx, b) {
var origin = sublayer.getSource()['crossOrigin'];
var visible = sublayer.getVisible();
var title = sublayer.get('title');
if (visible === true && origin == 'anonymous') {
printposs=true;
} else if (visible == false) {
printposs = true;
} else {
printposs = false;
//return printposs; can abort here as soon as one visible layer doesnt have Crossorigin
}
return printposs;
});
console.log('outer return:' + printposs + ' - It seems always the value of the last "processed" layer is returned')
}
});

Replace busy waiting with condition variable

How can I replace the below busy waiting with condition variables?
while (this_thread != pthread_self()){
pthread_mutex_lock(&lock);
if(this_thread == -1)
this_thread = get_id();
pthread_mutex_unlock(&lock);
}
Thanks!
Assuming the value returned by get_id() is only set via a function called set_id(), please see this pseudo code:
globals
Mutex mutex
Condition cond
Id id
code
set_id(id_in)
{
mutex_lock
id = id_in
cond_signal
mutex_unlock
}
test()
{
mutex_lock
while ((this_thread = get_id()) != pthread_self())
cond_wait
mutex_unlock
}

How to replace window.confirm with notification.confirm in HYBRID mobileApp(iOS)

Currently in my Web app I'm doing As shown in the below Code.
So What happens after reaching the $window.Confirm compiler waits for response on Alert box and depending on that Leave gets true or false.
Finally this method returns that boolean value to its coupled method.
//** IN WEB APP**//
function shouldLeave(next)
var message = 'Do you wish to leave this Page';
var leave = $window.confirm(message); // Return bool value as per user selection
if (leave) {
//Doing my job...
reset();
}
return leave;
}
Now for Hybrid What I'm doing is:
function shouldLeave(next) {
var message = 'Do you wish to leave this Page';
var leave = notification.confirm(message, callbackMethod(),title,[Ok, Cancel]); // Here there is no return value . Return depends on Callback as the callback method gets called depending on user selection
if (leave) {
//Doing my job...
reset();
}
return leave;
}
function CallBack(index)
{
switch(index)
{
case 1 :
leave=true; break;
case 2 :
leave=false; break;
default:
leave=-1; break
}
return leave;
}
So here after executing the Notification.confirm compiler is not waiting for user response and moving to Next line.(but for Window. Confirm is was doing so).
So Now my doubt is how to refactor this code so that mu Should leave method will return the proper leave value to its coupled method. Because by the time my callback method executes after user interaction in hybrid app shouldLeave completes its execution. So its not behaving like $window.confirm functionality.
Any suggestion is appreciated.
Check this
function shouldLeave() {
var message = 'Do you wish to leave this Page';
navigator.notification.confirm(
message, // message
onConfirm, // callback to invoke with index of button
'Confirmation', // title
'Ok, Cancel' // buttonLabels
);
}
//on button press, the onConfirm function is called
function onConfirm(button) {
//console.log('You selected button ' + button);
if(button == 1){
//pressed "Ok"
console.log("Ok ACTION");
}
else if(button == 2){
//pressed "Cancel"
console.log("Cancel ACTION");
}
}
This should work.
change
notification.confirm(message, callbackMethod(), title, [Ok, Cancel]);
to
notification.confirm(message, callbackMethod, title, [Ok, Cancel]);
Explanation:
if you put callbackMethod(), it is executed as soon as the execution reach that line
if you put callbackMethod withouth the (), you are declaring the function to be executed on the callback.

Prevent the creation of events with conflicting times with FullCalendar

I'm trying to disable dayclick from functioning when there is already an event at the time. Is this possible? I've seen functions that stop people dragging one event to a conflicting time, but nothing that acts before creation.
Thanks
I've sorted it with click events function
function checkOverlap(event) {
var start = new Date(event);
var end = new Date(event.end);
var overlap = $('#calendar').fullCalendar('clientEvents', function(ev) {
if( ev == event) {
return false;
}
var estart = new Date(ev.start);
var eend = new Date(ev.end);
return (Math.round(estart) == Math.round(start));
});
if (overlap.length){
return false;
} else {
return true;
}
}
This is mostly possible because my app only allows users to make appointments for 1 hour and always on the hour. If you have a more flexible model where you can have variable length and starting time of the appointments, you will have to fiddle with the following line:
return (Math.round(estart) == Math.round(start));

How to wait for 3 seconds in ActionScript 2 or 3?

Is there any way to implement waiting for, say, 3 seconds in ActionScript, but to stay within same function? I have looked setInterval, setTimeOut and similar functions, but what I really need is this:
public function foo(param1, param2, param3) {
//do something here
//wait for 3 seconds
//3 seconds have passed, now do something more
}
In case you wonder why I need this - it is a legal requirement, and no, I can't change it.
Use the Timer to call a function after 3 seconds.
var timer:Timer = new Timer(3000);
timer.addEventListener(TimerEvent.TIMER, callback); // will call callback()
timer.start();
To do this properly, you should create the timer as an instance variable so you can remove the listener and the timer instance when the function is called, to avoid leaks.
class Test {
private var timer:Timer = new Timer(3000);
public function foo(param1:int, param2:int, param3:int):void {
// do something here
timer.addEventListener(TimerEvent.TIMER, fooPartTwo);
timer.start();
}
private function fooPartTwo(event:TimerEvent):void {
timer.removeEventListener(TimerEvent.TIMER, fooPartTwo);
timer = null;
// 3 seconds have passed, now do something more
}
}
You could also use another function inside your foo function and retain scope, so you don't need to pass variables around.
function foo(param1:int, param2:int, param3:int):void {
var x:int = 2; // you can use variables as you would normally
// do something here
var timer:Timer = new Timer(3000);
var afterWaiting:Function = function(event:TimerEvent):void {
timer.removeEventListener(TimerEvent.TIMER, afterWaiting);
timer = null;
// 3 seconds have passed, now do something more
// the scope is retained and you can still refer to the variables you
// used earlier
x += 2;
}
timer.addEventListener(TimerEvent.TIMER, afterWaiting);
timer.start();
}
For AS3 use Radu's answer.
For AS2 use the setInterval function like so:
var timer = setInterval(function, 3000, param1, param2);
function (param1, param2) {
// your function here
clearInterval(timer);
}
You can also use delayedCall, from TweenMax. IMHO, it's the sharpest way to do that if you are familiar to TweenMax family.
TweenMax.delayedCall(1, myFunction, ["param1", 2]);
function myFunction(param1:String, param2:Number):void
{
trace("called myFunction and passed params: " + param1 + ", " + param2);
}
In your case, using a anonymous function:
public function foo(param1, param2, param3) {
//do something here
trace("I gonna wait 3 seconds");
TweenMax.delayedCall(3, function()
{
trace("3 seconds have passed");
});
}
why you are doing some confused ways instead of doing the right way?
there is a method named:"setTimeout()";
setTimeout(myFunction,3000);
myFunction is the function you want to call after the period.and 3000 is the period you want to wait(as miliseconds).
you don't need to set then clear interval, or make a timer with one repeat count or do sth else with more trouble☺.
There is no Sleep in ActionScript. But there are other ways to achieve the same thing without having all your code in a single function and wait within that function a specific amount of time.
You can easily have your code in two functions and call the 2nd one after a specific timeout you set in your 1st function.
THIS IS NOT WITHIN ONE FUNCTION - ANSWERS: "How to wait for X seconds in AS2 & 3"
...without using setInterval or clearInterval.
The answers posted above are much faster and easier to use. I posted this here, just in case...
Sometimes you may not be able to use set/clearInterval or other methods based on development restrictions. Here is a way to make a delay happen without using those methods.
AS2 - If you copy/paste the code below to your timeline, make sure to add two movie clips to the stage, btnTest and btnGlowTest (include like instance names). Make "btnGlowTest" larger, a different color, & behind "btnTest" (to simulate a glow and a button, respectively).
Compile and check the output panel for the trace statements to see how the code is working. Click on btnTest - btnGlowTest will then become visible throughout the duration of the delay, (just for visual representation).
I have an onEnterFrame countdown timer in here as well, (demos stopping/switching timers).
If you want the delay/glow to be longer - increase the glowGameTime number. Change the names to fit your own needs and/or apply the logic differently.
var startTime:Number = 0;
var currentTime:Number = 0;
var mainTime:Number = 5;//"game" time on enter frame
var glowStartTime:Number = 0;
var glowCurrentTime:Number = 0;
var glowGameTime:Number = 1.8;//"delayed" time on press
btnGlowTest._visible = false;
this.onEnterFrame = TimerFunction;
startTime = getTimer();
function TimerFunction()
{
currentTime = getTimer();
var timeLeft:Number = mainTime - ((currentTime - startTime)/1000);
timeLeft = Math.floor(timeLeft);
trace("timeLeft = " + timeLeft);
if(timeLeft <= 0)
{
trace("time's up...3 bucks off");
//...do stuff here
btnGlowTest._visible = false;//just for show
btnTest._visible = false;//just for show
StopTime();
}
}
function glowTimerFunction()
{
glowCurrentTime = getTimer();
var glowTimeLeft:Number = glowGameTime - ((glowCurrentTime - glowStartTime)/1000);
glowTimeLeft = Math.floor(glowTimeLeft);
//trace("glowTimeleft = " + glowTimeLeft);
if(glowTimeLeft <= 0)
{
trace("TIME DELAY COMPLETE!");
//...do stuff here
btnGlowTest._visible = false;//just for show
btnTest._visible = false;//just for show
StopTime();
}
}
btnTest.onPress = function()
{
trace("onPress");
btnGlowTest._visible = true;
StopTime();
GlowTime();
}
function GlowTime()
{
trace("GlowTime Function");
this.onEnterFrame = glowTimerFunction;
glowStartTime = getTimer();
}
function StopTime()
{
trace(">>--StopTime--<<");
delete this.onEnterFrame;
}
AS3 - Below is the code from above setup to run in AS3. There are different ways to accomplish similar results, yet based on the project scope, these are the methods that were used in order to get things functioning properly.
If you copy/paste the code below to your timeline, make sure to add two movie clips to the stage, btnTest and btnGlowTest (include like instance names). Make "btnGlowTest" larger, a different color, & behind "btnTest" (to simulate a glow and a button, respectively).
Compile and check the output panel for the trace statements to see how the code is working. Click on btnTest - btnGlowTest will then become visible throughout the duration of the delay, (just for visual representation).
If you want the delay/glow to be longer - increase the GlowTimer:Timer number, (currently set to 950). Change the names to fit your own needs and/or apply the logic differently.
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
var startTime:Number = 0;
var currentTime:Number = 0;
var gameTime:Number = 4;//"game" time on enter frame
var GlowTimer:Timer = new Timer(950,0);//"delayed" time on press
btnGlowTest.visible = false;
GlowTimer.addEventListener(TimerEvent.TIMER, GlowTimeListener, false, 0, true);
btnTest.addEventListener(MouseEvent.MOUSE_DOWN, btnTestPressed, false, 0, true);
addEventListener(Event.ENTER_FRAME,TimerFunction, false, 0, true);
startTime = getTimer();
function TimerFunction(event:Event)
{
currentTime = getTimer();
var timeLeft:Number = gameTime - ((currentTime - startTime)/1000);
timeLeft = Math.floor(timeLeft);
trace("timeLeft = " + timeLeft);
if(timeLeft <= 0)
{
trace("time's up, 3 bucks off");
StopTime();
}
}
function GlowTimeListener (e:TimerEvent):void
{
trace("TIME DELAY COMPLETE!");
StopTime();
}
function btnTestPressed(e:MouseEvent)
{
trace("PRESSED");
removeEventListener(Event.ENTER_FRAME, TimerFunction);
btnGlowTest.visible = true;
GlowTimer.start();
}
function StopTime()
{
trace(">>--Stop Time--<<");
btnGlowTest.visible = false;//just for show
btnTest.visible = false;//just for show
GlowTimer.stop();
removeEventListener(TimerEvent.TIMER, GlowTimeListener);
removeEventListener(Event.ENTER_FRAME, TimerFunction);
}

Resources