Search code examples
javaandroidcounterlimit

Limit button press to three times per week


I have a button on which I want to permit presses three times a week.

How can I track this and make sure that once it reaches its maximum no button press will happen?

Here's my basic code for the button click and count.

int count = 0;
limit_ButtonPress()

Button btn = findViewById(R.id.comp)
btn.setOnClickListener(new OnClickListener){
    (View v){
    count++
}
private void limit_ButtonPress(){
    if(count> 0  && count< 5){
    btn.setVisabilty(View.Invisable)
} 

How can I limit the three presses per week?


Solution

  • Have a look at this. You want that button can only be clicked thrice a week and not more than that. So have this type of Firebase database structure:

    "root/" : {
        "users" : {
            "user_01" : {
                    //some profile data about the user like name email etc.
                    "data" : "val"
                    //this is important
                    "signUpTime" : 1563245126 //this is the timestamp of when the user signed up
                },
            ...
        }
       "activity" : {
           "user_01" : {
                random_id_01 : {
                    "clickTime" : 156845164 //timestamp of click
                },
                ...
           }
       }
    }
    

    This has the responsibility of defining reading and writing access to the database for users.

    Now comes the Java/Android part:

    private void initUI(){
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("activity").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query query = databaseReference.orderByChild("clickTime").limitToLast(3);
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    //now count the children in dataSnapshot
                    int totalChildren = (int) dataSnapshot.getChildrenCount();
                    if(totalChildren > 2){
                        //now check for this person properly
                        int milliSecInAWeek = 7*24*60*60*1000; //perhaps I'm right ;)
                        //now check if the last of the three click was within this week 
                        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                            //well this is actually a loop kind of thing
                            //but we are just concerned about the first most click so we will call return just on the first child iteration :)
                            UserActivity userActivity = snapshot.getValue(UserActivity.class);
                            
                            if(userActivity.getClickTime() - System.currentTimeMillis() < milliSecInAWeek){
                                //this person has clicked three times in this week disable the button
                            }else{
                                //this person has got chance(s) to click. let the button be enabled
                            }
                            return;
                        }
                    }else{
                        //this user has clicked less then 3 times so the let the button be clickable for the user
                    }
                }else{
                    //there is no activity by this user let the button be clickable
                }
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });
    }
    
    private class UserActivity{
        
        private float clickTime;
    
        public UserActivity() {
            
        }
    
        public UserActivity(float clickTime) {
            this.clickTime = clickTime;
        }
    
        public float getClickTime() {
            return clickTime;
        }
    
        public void setClickTime(float clickTime) {
            this.clickTime = clickTime;
        }
    }