2021-06-27 20:44:35 +00:00
package androidx.appcompat.app ;
import android.annotation.SuppressLint ;
import android.content.Context ;
import android.location.Location ;
import android.location.LocationManager ;
import android.util.Log ;
import androidx.annotation.NonNull ;
import androidx.annotation.RequiresPermission ;
import androidx.annotation.VisibleForTesting ;
import androidx.core.content.PermissionChecker ;
import java.util.Calendar ;
public class TwilightManager {
private static final int SUNRISE = 6 ;
private static final int SUNSET = 22 ;
private static final String TAG = " TwilightManager " ;
private static TwilightManager sInstance ;
private final Context mContext ;
private final LocationManager mLocationManager ;
private final TwilightState mTwilightState = new TwilightState ( ) ;
public static class TwilightState {
public boolean isNight ;
public long nextUpdate ;
public long todaySunrise ;
public long todaySunset ;
public long tomorrowSunrise ;
public long yesterdaySunset ;
}
@VisibleForTesting
public TwilightManager ( @NonNull Context context , @NonNull LocationManager locationManager ) {
this . mContext = context ;
this . mLocationManager = locationManager ;
}
public static TwilightManager getInstance ( @NonNull Context context ) {
if ( sInstance = = null ) {
Context applicationContext = context . getApplicationContext ( ) ;
sInstance = new TwilightManager ( applicationContext , ( LocationManager ) applicationContext . getSystemService ( " location " ) ) ;
}
return sInstance ;
}
@SuppressLint ( { " MissingPermission " } )
private Location getLastKnownLocation ( ) {
Location location = null ;
Location lastKnownLocationForProvider = PermissionChecker . checkSelfPermission ( this . mContext , " android.permission.ACCESS_COARSE_LOCATION " ) = = 0 ? getLastKnownLocationForProvider ( " network " ) : null ;
if ( PermissionChecker . checkSelfPermission ( this . mContext , " android.permission.ACCESS_FINE_LOCATION " ) = = 0 ) {
location = getLastKnownLocationForProvider ( " gps " ) ;
}
return ( location = = null | | lastKnownLocationForProvider = = null ) ? location ! = null ? location : lastKnownLocationForProvider : location . getTime ( ) > lastKnownLocationForProvider . getTime ( ) ? location : lastKnownLocationForProvider ;
}
@RequiresPermission ( anyOf = { " android.permission.ACCESS_COARSE_LOCATION " , " android.permission.ACCESS_FINE_LOCATION " } )
private Location getLastKnownLocationForProvider ( String str ) {
try {
if ( this . mLocationManager . isProviderEnabled ( str ) ) {
return this . mLocationManager . getLastKnownLocation ( str ) ;
}
return null ;
} catch ( Exception e ) {
2021-08-09 22:50:52 +00:00
Log . d ( TAG , " Failed to get last known location " , e ) ;
2021-06-27 20:44:35 +00:00
return null ;
}
}
private boolean isStateValid ( ) {
return this . mTwilightState . nextUpdate > System . currentTimeMillis ( ) ;
}
@VisibleForTesting
public static void setInstance ( TwilightManager twilightManager ) {
sInstance = twilightManager ;
}
private void updateState ( @NonNull Location location ) {
long j ;
TwilightState twilightState = this . mTwilightState ;
long currentTimeMillis = System . currentTimeMillis ( ) ;
TwilightCalculator instance = TwilightCalculator . getInstance ( ) ;
instance . calculateTwilight ( currentTimeMillis - 86400000 , location . getLatitude ( ) , location . getLongitude ( ) ) ;
long j2 = instance . sunset ;
instance . calculateTwilight ( currentTimeMillis , location . getLatitude ( ) , location . getLongitude ( ) ) ;
boolean z2 = instance . state = = 1 ;
long j3 = instance . sunrise ;
long j4 = instance . sunset ;
instance . calculateTwilight ( 86400000 + currentTimeMillis , location . getLatitude ( ) , location . getLongitude ( ) ) ;
long j5 = instance . sunrise ;
if ( j3 = = - 1 | | j4 = = - 1 ) {
j = 43200000 + currentTimeMillis ;
} else {
j = ( currentTimeMillis > j4 ? 0 + j5 : currentTimeMillis > j3 ? 0 + j4 : 0 + j3 ) + 60000 ;
}
twilightState . isNight = z2 ;
twilightState . yesterdaySunset = j2 ;
twilightState . todaySunrise = j3 ;
twilightState . todaySunset = j4 ;
twilightState . tomorrowSunrise = j5 ;
twilightState . nextUpdate = j ;
}
public boolean isNight ( ) {
TwilightState twilightState = this . mTwilightState ;
if ( isStateValid ( ) ) {
return twilightState . isNight ;
}
Location lastKnownLocation = getLastKnownLocation ( ) ;
if ( lastKnownLocation ! = null ) {
updateState ( lastKnownLocation ) ;
return twilightState . isNight ;
}
2021-08-09 22:50:52 +00:00
Log . i ( TAG , " Could not get last known location. This is probably because the app does not have any location permissions. Falling back to hardcoded sunrise/sunset values. " ) ;
2021-06-27 20:44:35 +00:00
int i = Calendar . getInstance ( ) . get ( 11 ) ;
return i < 6 | | i > = 22 ;
}
}