javaandroidandroid-buttonrewardedvideoad

Lock a Button With timer displayed on the button in android studio


I am Working on a android app in which I am displaying a rewarded video ad and want that button to be locked for 10 minutes, I want a timer to be displayed on button after one uses it, here is my java file

watch_video_buuton.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View view) {

        Toast.makeText(Home_page.this,"Please tap more times to load the ad", Toast.LENGTH_LONG).show();

        if (mRewardedVideoAd.isLoaded()) {
                mRewardedVideoAd.show();
        }
        else {
                loadRewardedVideoAd();
       }

    }
 });


@Override
public void onRewardedVideoAdLoaded() {
}

@Override
public void onRewardedVideoAdOpened() {

}

@Override
public void onRewardedVideoStarted() {

}

@Override
public void onRewardedVideoAdClosed() {

    loadRewardedVideoAd();

}

@Override
public void onRewarded(RewardItem rewardItem) {

    Toast.makeText(Home_page.this,"Congratulations, you will get 1000 points next time you open the app ", Toast.LENGTH_LONG).show();

    SharedPreferences sp = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    int n =  myIntValue+1000;
    editor.putInt("your_int_key", n);
    editor.commit();
    user_id_child.child("scores").setValue(+n);

}

Solution

  • You can use bellow code for your button:

    public void button_OnClick(View view) {
        Button button=findViewById(R.id.button);
        button.setEnabled(false);
    
        final long startTime= Calendar.getInstance().getTime().getTime();
        final Timer timer=new Timer();
        final Activity activity = this;
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
                long curentTime=Calendar.getInstance().getTime().getTime();
                long elapsedTime=curentTime-startTime;
                ToastTime(10*60*1000, elapsedTime);
                if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                    timer.cancel();
                    EnableButton();
                }
            }
        };
        timer.schedule(task, 500, 2000);
    }
    

    Where

    private void ToastTime(long totalTime, long elapsedTime){
        final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
        if(remainInSec>0) {
            final Activity activity = this;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(activity, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    
    private void EnableButton(){
        Button button=findViewById(R.id.button);
        button.setEnabled(true);
    }
    

    Or for simplify:

    public void button_OnClick(View view) {
        final Button button=findViewById(R.id.button);
        button.setEnabled(false);
    
        final long startTime= Calendar.getInstance().getTime().getTime();
        final Timer timer=new Timer();
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
                long curentTime=Calendar.getInstance().getTime().getTime();
                long elapsedTime=curentTime-startTime;
                ToastTime(10*60*1000, elapsedTime);
                if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                    timer.cancel();
                    button.setEnabled(true);
                }
            }
        };
        timer.schedule(task, 500, 2000);
    }
    
    private void ToastTime(long totalTime, long elapsedTime){
        final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
        if(remainInSec>0) {
            final Activity activity = this;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(activity, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    

    Edit

    If you have many run on main thread error, try this: Declare a global variable:

    boolean isLooperCalled;
    

    Now use this:

    public void button_OnClick(View view) {
        final Button button=findViewById(R.id.button);
        button.setEnabled(false);
    
        isLooperCalled=false;   //It's new
        final long startTime= Calendar.getInstance().getTime().getTime();
        final Timer timer=new Timer();
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
                if(isLooperCalled==false){   //It's new
                    Looper.prepare();
                    isLooperCalled=true;
                }
                long curentTime=Calendar.getInstance().getTime().getTime();
                long elapsedTime=curentTime-startTime;
                ToastTime(10*60*1000, elapsedTime);
                if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                    timer.cancel();
                    button.setEnabled(true);
                }
            }
        };
        timer.schedule(task, 500, 2000);
    }
    
    private void ToastTime(long totalTime, long elapsedTime){
        final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
        if(remainInSec>0) {   //It's edited
            Toast.makeText(this, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
        }
    }
    

    If error is persist, Increase time step in timer.schedule(task, 500, 2000) from 2000 to 5000 of 10000 (5 sec. or 10 sec.).