package com.wigwamlabs.veckify;
import android.app.KeyguardManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.view.Window;
import android.widget.SeekBar;
import android.widget.TextView;
import com.wigwamlabs.spotify.ImageProvider;
import com.wigwamlabs.spotify.Session;
import com.wigwamlabs.spotify.Track;
import com.wigwamlabs.spotify.ui.SpotifyImageView;
import com.wigwamlabs.spotify.ui.SpotifyPlayerActivity;
import java.util.Calendar;
import static android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL;
import static android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
import static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
public class NowPlayingActivity extends SpotifyPlayerActivity implements TimeUpdater.Callback {
public static final String ACTION_ALARM = "alarm";
public static final String EXTRA_ALARM_NAME = "name";
private final Handler mHandler = new Handler();
private Track mTrack;
private boolean mAlarmLaunchedWithKeyguard;
private boolean mAlarmIsDismissed;
private Runnable mCheckKeyguardActivation;
private TextView mCurrentTime;
private TimeUpdater mTimeUpdater;
@Override
protected void onCreate(Bundle savedInstanceState) {
Debug.logLifecycle("NowPlayingActivity.onCreate()");
super.onCreate(savedInstanceState);
handleIntent(getIntent());
initUi();
mTimeUpdater = new TimeUpdater(mHandler, this);
bindSpotifyService();
}
@Override
protected void onNewIntent(Intent intent) {
Debug.logLifecycle("NowPlayingActivity.onNewIntent()");
super.onNewIntent(intent);
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (intent != null && ACTION_ALARM.equals(intent.getAction())) {
Debug.logAlarmScheduling("New alarm, turn screen on etc.");
mAlarmIsDismissed = false;
mAlarmLaunchedWithKeyguard = isKeyguardActive();
final String name = intent.getStringExtra(EXTRA_ALARM_NAME);
getActionBar().setTitle(name);
} else {
mAlarmIsDismissed = true;
}
}
@Override
protected void onResume() {
Debug.logLifecycle("NowPlayingActivity.onResume()");
super.onResume();
if (mAlarmLaunchedWithKeyguard && !mAlarmIsDismissed && !isKeyguardActive()) {
Debug.logAlarmScheduling("Dismissing alarm since user deactivated keyguard");
mAlarmIsDismissed = true;
}
updateWindowFlags();
if (!isKeyguardActive()) {
mCheckKeyguardActivation = new Runnable() {
@Override
public void run() {
if (isKeyguardActive()) {
onKeyguardActivated();
} else {
mHandler.postDelayed(this, 2000);
}
}
};
mHandler.postDelayed(mCheckKeyguardActivation, 5000);
}
mTimeUpdater.start();
}
@Override
protected void onPause() {
Debug.logLifecycle("NowPlayingActivity.onPause()");
super.onPause();
if (!mAlarmIsDismissed && !mAlarmLaunchedWithKeyguard) {
Debug.logAlarmScheduling("Dismissing alarm since user paused activity");
mAlarmIsDismissed = true;
}
if (mCheckKeyguardActivation != null) {
mHandler.removeCallbacks(mCheckKeyguardActivation);
mCheckKeyguardActivation = null;
}
mTimeUpdater.stop();
}
@Override
protected void onDestroy() {
Debug.logLifecycle("NowPlayingActivity.onDestroy()");
if (mTrack != null) {
mTrack.destroy();
mTrack = null;
}
super.onDestroy();
}
private void initUi() {
setContentView(R.layout.activity_now_playing);
mCurrentTime = (TextView) findViewById(R.id.currentTime);
setTrackImage((SpotifyImageView) findViewById(R.id.trackImage), ImageProvider.SIZE_NORMAL);
setTrackArtists((TextView) findViewById(R.id.trackArtists));
setTrackName((TextView) findViewById(R.id.trackName));
setTrackProgress((SeekBar) findViewById(R.id.seekBar));
setResumeButton(findViewById(R.id.resumeButton));
setPauseButton(findViewById(R.id.pauseButton));
setNextButton(findViewById(R.id.nextButton));
}
@Override
public void onTimeUpdated(Calendar cal) {
final String time = String.format("%d:%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
mCurrentTime.setText(time);
}
private boolean isKeyguardActive() {
final KeyguardManager manager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
//TODO use manager.isKeyguardLocked() on API 16+?
return manager.inKeyguardRestrictedInputMode();
}
private void onKeyguardActivated() {
// no need to check anymore
mHandler.removeCallbacks(mCheckKeyguardActivation);
mCheckKeyguardActivation = null;
// switch mode, treat it as if the alarm was launched with keyguard on
if (!mAlarmIsDismissed) {
mAlarmLaunchedWithKeyguard = true;
}
//
updateWindowFlags();
}
private void updateWindowFlags() {
final Window window = getWindow();
int addFlags = 0;
int clearFlags = 0;
// we always want to keep the screen on
addFlags |= FLAG_KEEP_SCREEN_ON
| FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
// hide all chrome if the keyguard is active
if (!mAlarmIsDismissed && isKeyguardActive()) {
addFlags |= FLAG_FULLSCREEN;
getActionBar().hide();
} else {
clearFlags |= FLAG_FULLSCREEN;
getActionBar().show();
}
// turn on screen brightness when the alarm is not dismissed
window.getAttributes().screenBrightness = mAlarmIsDismissed ? BRIGHTNESS_OVERRIDE_NONE : BRIGHTNESS_OVERRIDE_FULL;
// turn screen the screen if the alarm is not dismissed
final int windowFlagsRunningAlarm = FLAG_TURN_SCREEN_ON
| FLAG_SHOW_WHEN_LOCKED
| FLAG_DISMISS_KEYGUARD;
if (mAlarmIsDismissed) {
clearFlags |= windowFlagsRunningAlarm;
} else {
addFlags |= windowFlagsRunningAlarm;
}
window.addFlags(addFlags);
window.clearFlags(clearFlags);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
startActivity(getParentActivityIntent());
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSpotifySessionAttached(Session spotifySession) {
super.onSpotifySessionAttached(spotifySession);
setAutoLogin(true);
}
}