Search code examples
androidandroid-radiogroup

Disable Radio groups for certain period of time (Android)


I have 3 Radio Groups in a custom list view. I need to enable the first radio group from morning 9 to 1 pm and disable after that. Second radio group to be enable from 1 pm to 8 pm and disable after and third radio group to be enabled from 8 pm to 8 am and disable after. How can I achieve the same ??

BroadCastReceiver.java

public class BackgroundService extends Service {
private static BroadcastReceiver mTickReceiver;

public BackgroundService()
{

}



@Override
public IBinder onBind(Intent arg0)
{
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onCreate()
{
    registerReceiver();
}

@Override
public void onDestroy()
{
    unregisterReceiver(mTickReceiver);
    mTickReceiver = null;
}



private void registerReceiver()
{
    mTickReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)  // this will fire every minute
        {
            String shift = null;
            DateFormat df = new SimpleDateFormat("HH:mm");
            String currentTimeString = df.format(Calendar.getInstance().getTime());
            Log.d("CurrentTime",currentTimeString);
            int currentTime=convertTimeToMinutes(currentTimeString);
            Log.d("CurrentTime1", String.valueOf(currentTime));
            Intent i=new Intent();
            i.setAction("TimeData");

            if(currentTime>=480 && currentTime<780) {
                shift = "Shift1";

            }
           else if(currentTime>=780 && currentTime<1200) {
                shift = "Shift2";


            }
           else if(currentTime>=1200 || currentTime<480) {
                shift = "Shift3";

            }
            Log.d("TAG1",shift);

            intent.putExtra("Shift",shift);

            sendBroadcast(i);


        }
    };
    IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK); // this will broadcast Intent every minute
    registerReceiver(mTickReceiver, filter);
}
private int convertTimeToMinutes(String s) {
    String[] hourMin = s.split(":");
    int hour = Integer.parseInt(hourMin[0]);
    int mins = Integer.parseInt(hourMin[1]);
    int hoursInMins = hour * 60;
    return hoursInMins + mins;
}

}

In Activity onCreate method I am calling BroadcastReceiver as following

    Intent i=new Intent(this, BackgroundService.class);
    startService(i);
    IntentFilter filter = new IntentFilter("TimeData");
    registerReceiver(new MyBroadcastReceiver(),filter);

BroadCastReceiver Class in Activity is as follows

    class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // GET BROADCAST FROM RECEIVER IN THE BACKGROUND SERVICE CLASS
        Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_SHORT).show();

        Log.d("ActionData",intent.getAction());  // this works, it is checked

        if (intent.getAction() == "TimeData") {
            String shiftValue1= intent.getStringExtra("Shift");
            Log.d("shiftValue1",shiftValue1);
        }
    }
}

Error I am getting is

FATAL EXCEPTION: main Process: com.rakyow.ehandor, PID: 11492 java.lang.RuntimeException: Error receiving broadcast Intent { act=TimeData flg=0x10 } in com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver@1acc203e at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:917) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5576) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) Caused by: java.lang.NullPointerException: println needs a message at android.util.Log.println_native(Native Method) at android.util.Log.d(Log.java:139) at com.rakyow.ehandor.HandoverDetailActivity$MyBroadcastReceiver.onReceive(HandoverDetailActivity.java:290) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:907) at android.os.Handler.handleCallback(Handler.java:815)  at android.os.Handler.dispatchMessage(Handler.java:104)  at android.os.Looper.loop(Looper.java:194)  at android.app.ActivityThread.main(ActivityThread.java:5576)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 


Solution

  • this is how you check time every minute:

    public class BackgroundService extends Service {
        private static BroadcastReceiver mTickReceiver;
    
        public BackgroundService()
        {
    
        }
    
    
    
        @Override
        public IBinder onBind(Intent arg0)
        {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
        }
    
        @Override
        public void onCreate()
        {
            registerReceiver();
        }
    
        @Override
        public void onDestroy()
        {
            unregisterReceiver(mTickReceiver);
            mTickReceiver = null;
        }
    
    
    
        private void registerReceiver()
        {
            mTickReceiver = new BroadcastReceiver()
            {
                @Override
                public void onReceive(Context context, Intent intent)  // this will fire every minute
                {
                    Log.d("TAG", "TICKS");
                    // Check current time using getTimeInMilliSeconds() 
                   // if time is in your desired range, send UI an intent that it should change radio buttons 
    
                }
            };
            IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK); // this will broadcast Intent every minute
            registerReceiver(mTickReceiver, filter);
        }
    
    }
    

    How to send info/data from a receiver in a service to MainActivity, in your case info to update UI.

    In above example I passed location data, you can pass any information once you checked your time range.

    UPDATE:

    • Use SimpleDateFormat to convert milliseconds to hours string (e.g. 1481879288 is "09:08am" (gmt)).

    • Write a function that convert HH:mm [am/pm] format into minutes - "09:08am" into 728 minutes, or say "02:35pm" to 875 minutes, this is from 12:00am reference point where 12:00am is 0 minutes elapsed. (Hint: break string, convert hours to minutes, add minutes part to converted one, write checks for am/pm) Hint for hint - if you convert milliseconds to 24-hour format, you will avoid check for am/pm, simply multiply 60xhourPart and add minutes part.

    • Compare minutes range with your range e.g. from 08:00am to 08:00pm, it will be 480 minutes to 1200 minutes, so if current time is 09:08am the check will be :

       int currentTime=convertTimeToMinutes(currentTimeString);              
      
       // to check if time is between 08:00am to 08:00pm
      
       if(currentTime>=480 && currentTime<=1200) {
      
          Log.d(TAG,"Current time is in between 08:00am to 08:00pm");
      
      }
      

    How if the range is between 8pm-8am(Next day happens)??

    If that's the case, use check to see if time is greater than 8pm or it is lower than 8am , notice here check is || not &&.

    if (currentTime>=1320 || currentTime <=480)
    {
    // your stuff
    }
    

    UPDATE 2

    String comparison must always be with .equals() method not ==, since you use ==, the line

    String shiftValue1= intent.getStringExtra("Shift")

    never executes, you should write it as :

    if (intent.getAction().equals("TimeData")) {
                String shiftValue1= intent.getStringExtra("Shift");
                Log.d("shiftValue1",shiftValue1);
    }
    

    UPDATE 3

    dont do this:

    intent.putExtra("Shift",shift);
    

    do this:

    i.putExtra("Shift",shift);
    

    See you are sending same intent object that was received.