use of org.omnirom.deskclock.provider.Alarm in project android_packages_apps_OmniClock by omnirom.
the class BrowseActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
if (getIntent().hasExtra(AlarmConstants.DATA_COLOR_THEME_ID)) {
int themeId = getIntent().getIntExtra(AlarmConstants.DATA_COLOR_THEME_ID, 0);
setTheme(Utils.getThemeResourceId(this, themeId));
} else if (getIntent().hasExtra(AlarmConstants.DATA_COLOR_THEME_LIGHT)) {
boolean lightTheme = getIntent().getBooleanExtra(AlarmConstants.DATA_COLOR_THEME_LIGHT, true);
setTheme(Utils.getThemeResourceId(this, lightTheme ? 0 : 1));
} else {
setTheme(Utils.getThemeResourceId(this));
}
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
mPrimaryColor = getResources().getColor(android.R.color.white);
mPrimaryColorDisabled = Utils.setColorAlpha(mPrimaryColor, getResources().getInteger(org.omnirom.deskclock.R.integer.disabled_text_alpha));
if (getIntent().hasExtra(AlarmConstants.DATA_ALARM_EXTRA)) {
mAlarm = getIntent().getParcelableExtra(AlarmConstants.DATA_ALARM_EXTRA);
if (mAlarm != null) {
mSelectedUri = mAlarm.alert.toString();
mPreAlarm = mAlarm.preAlarm;
}
}
if (mAlarm == null) {
mAlarm = new Alarm();
mPreAlarm = false;
}
if (getIntent().hasExtra(AlarmConstants.DATA_ALARM_EXTRA_URI)) {
mSelectedUri = getIntent().getStringExtra(AlarmConstants.DATA_ALARM_EXTRA_URI);
if (mSelectedUri != null) {
mAlarm.alert = Uri.parse(mSelectedUri);
}
}
if (getIntent().hasExtra(AlarmConstants.DATA_BROWSE_EXTRA_FALLBACK)) {
mLimitedMode = getIntent().getBooleanExtra(AlarmConstants.DATA_BROWSE_EXTRA_FALLBACK, false);
}
setContentView(R.layout.browse_activity);
mCurrentUri = findViewById(R.id.current_uri);
mSearchView = (SearchView) findViewById(R.id.query_pattern);
mSearchView.setOnQueryTextListener(this);
mSearchView.setSubmitButtonEnabled(false);
mSearchView.setVisibility(View.INVISIBLE);
mQueryTypeText = (TextView) findViewById(R.id.query_type_string);
mQueryList = (ListView) findViewById(R.id.query_result);
mFooterView = getLayoutInflater().inflate(R.layout.browse_footer_item, mQueryList, false);
mProgress = (ProgressBar) mFooterView.findViewById(R.id.query_progressbar);
mPasteUrl = findViewById(R.id.query_paste_url);
mPasteUrlText = (EditText) findViewById(R.id.query_paste_url_field);
ImageView pasteUrlButton = (ImageView) findViewById(R.id.query_paste_url_add);
pasteUrlButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!TextUtils.isEmpty(mPasteUrlText.getText().toString())) {
showPlaylistDialog();
}
}
});
mQueryList.addFooterView(mFooterView, null, false);
mQueryType = QUERY_TYPE_RECENT;
mQueryTypeText.setText(R.string.local_query_recent);
mChooseFolder = (TextView) findViewById(R.id.query_folder_button);
mChooseFolder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
launchStoragePicker();
}
});
mAdapter = createListAdapter();
mQueryList.setAdapter(mAdapter);
mAlarmsTab = findViewById(R.id.tab_alarms);
((ImageView) mAlarmsTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_alarm_white);
((TextView) mAlarmsTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_alarm);
mAlarmsTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.INVISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_ALARM;
mQueryTypeText.setText(R.string.local_query_alarm_ringtones);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mRecentTab = findViewById(R.id.tab_recent);
((ImageView) mRecentTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_star_white);
((TextView) mRecentTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_recent);
mRecentTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.INVISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_RECENT;
mQueryTypeText.setText(R.string.local_query_recent);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mArtistTab = findViewById(R.id.tab_artist);
((ImageView) mArtistTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_artist_white);
((TextView) mArtistTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_artist);
mArtistTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.VISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_ARTIST;
mQueryTypeText.setText(R.string.local_query_artist);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mAlbumTab = findViewById(R.id.tab_album);
((ImageView) mAlbumTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_album_white);
((TextView) mAlbumTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_album);
mAlbumTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.VISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_ALBUM;
mQueryTypeText.setText(R.string.local_query_album);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mTrackTab = findViewById(R.id.tab_track);
((ImageView) mTrackTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_track_white);
((TextView) mTrackTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_track);
mTrackTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.VISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_TRACK;
mQueryTypeText.setText(R.string.local_query_track);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mFolderTab = findViewById(R.id.tab_folder);
((ImageView) mFolderTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_folder_white);
((TextView) mFolderTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_folder);
mFolderTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.INVISIBLE);
mChooseFolder.setVisibility(View.VISIBLE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_FOLDER;
mQueryTypeText.setText(R.string.local_query_folder);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mPlaylistTab = findViewById(R.id.tab_playlist);
((ImageView) mPlaylistTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_playlist_white);
((TextView) mPlaylistTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_playlist);
mPlaylistTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.VISIBLE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.GONE);
mQueryType = QUERY_TYPE_PLAYLIST;
mQueryTypeText.setText(R.string.local_query_playlist);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
mStreamTab = findViewById(R.id.tab_stream);
((ImageView) mStreamTab.findViewById(R.id.tab_strip_image)).setImageResource(R.drawable.ic_earth_white);
((TextView) mStreamTab.findViewById(R.id.tab_strip_title)).setText(R.string.local_query_stream);
mStreamTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSearchView.setVisibility(View.GONE);
mChooseFolder.setVisibility(View.GONE);
mPasteUrl.setVisibility(View.VISIBLE);
mQueryType = QUERY_TYPE_STREAM;
mQueryTypeText.setText(R.string.local_query_stream);
clearList();
updateTabs();
doQuery(mCurrentQueryText, 0);
}
});
if (mLimitedMode) {
mStreamTab.setVisibility(View.GONE);
mPlaylistTab.setVisibility(View.GONE);
}
mFolderTab.setVisibility(View.GONE);
updateTabs();
mQueryList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
QueryItem queryItem = mAdapter.getItem(position);
if (queryItem.mQueryType != QUERY_TYPE_UNKNOWN) {
mSelectedUri = queryItem.mUri;
addToRecents(mSelectedUri);
Intent intent = new Intent();
intent.putExtra(AlarmConstants.DATA_ALARM_EXTRA_URI, mSelectedUri);
intent.putExtra(AlarmConstants.DATA_ALARM_EXTRA_NAME, queryItem.mName);
intent.putExtra(AlarmConstants.DATA_ALARM_EXTRA_TYPE, queryItem.mQueryType);
setResult(Activity.RESULT_OK, intent);
finish();
}
}
});
mQueryList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
QueryItem queryItem = mAdapter.getItem(position);
// TODO export as spotify open URL
return true;
}
});
cacheAlarmTones();
cacheRingtones();
View queryArea = findViewById(R.id.query_area);
queryArea.setVisibility(View.VISIBLE);
checkStoragePermissions();
}
use of org.omnirom.deskclock.provider.Alarm in project android_packages_apps_OmniClock by omnirom.
the class AlarmStateManager method registerInstance.
/**
* This registers the AlarmInstance to the state manager. This will look at the instance
* and choose the most appropriate state to put it in. This is primarily used by new
* alarms, but it can also be called when the system time changes.
*
* Most state changes are handled by the states themselves, but during major time changes we
* have to correct the alarm instance state. This means we have to handle special cases as
* describe below:
*
* <ul>
* <li>Make sure all dismissed alarms are never re-activated</li>
* <li>Make sure firing alarms stayed fired unless they should be auto-silenced</li>
* <li>Missed instance that have parents should be re-enabled if we went back in time</li>
* <li>If alarm was SNOOZED, then show the notification but don't update time</li>
* <li>If low priority notification was hidden, then make sure it stays hidden</li>
* </ul>
*
* If none of these special case are found, then we just check the time and see what is the
* proper state for the instance.
*
* @param context application context
* @param instance to register
*/
public static void registerInstance(Context context, AlarmInstance instance, boolean updateNextAlarm) {
Calendar currentTime = Calendar.getInstance();
LogUtils.v("current = " + sdf.format(currentTime.getTime()));
Calendar alarmTime = instance.getAlarmTime();
LogUtils.v("alarm at = " + sdf.format(alarmTime.getTime()));
Calendar timeoutTime = instance.getTimeout(context);
LogUtils.v("timeoutTime at = " + (timeoutTime != null ? sdf.format(timeoutTime.getTime()) : "never"));
// Calendar lowNotificationTime = instance.getLowNotificationTime();
int highNotificationOffset = Utils.getHighNotificationOffset(context);
Calendar highNotificationTime = instance.getHighNotificationTime(highNotificationOffset);
LogUtils.v("high at = " + sdf.format(highNotificationTime.getTime()));
Calendar missedTTL = instance.getMissedTimeToLive();
Calendar preAlarmTime = instance.getPreAlarmTime();
if (instance.mPreAlarm) {
LogUtils.v("pre-alarm at = " + sdf.format(preAlarmTime.getTime()));
}
// Handle special use cases here
if (instance.mAlarmState == AlarmInstance.DISMISSED_STATE) {
// This should never happen, but add a quick check here
LogUtils.e("Alarm Instance is dismissed, but never deleted");
setDismissState(context, instance);
return;
} else if (instance.mAlarmState == AlarmInstance.FIRED_STATE) {
// Keep alarm firing, unless it should be timed out
boolean hasTimeout = timeoutTime != null && currentTime.after(timeoutTime);
if (!hasTimeout) {
setFiredState(context, instance);
return;
}
} else if (instance.mAlarmState == AlarmInstance.MISSED_STATE) {
if (currentTime.before(alarmTime)) {
if (instance.mAlarmId == null) {
// This instance parent got deleted (ie. deleteAfterUse), so
// we should not re-activate it.-
setDismissState(context, instance);
return;
}
// TODO: This will re-activate missed snoozed alarms, but will
// use our normal notifications. This is not ideal, but very rare use-case.
// We should look into fixing this in the future.
// Make sure we re-enable the parent alarm of the instance
// because it will get activated by by the below code
ContentResolver cr = context.getContentResolver();
Alarm alarm = Alarm.getAlarm(cr, instance.mAlarmId);
alarm.enabled = true;
Alarm.updateAlarm(cr, alarm);
}
}
// Fix states that are time sensitive
if (currentTime.after(missedTTL)) {
// Alarm is so old, just dismiss it
setDismissState(context, instance);
} else if (currentTime.after(alarmTime)) {
// There is a chance that the TIME_SET occurred right when the alarm should go off, so
// we need to add a check to see if we should fire the alarm instead of marking it
// missed.
Calendar alarmBuffer = Calendar.getInstance();
alarmBuffer.setTime(alarmTime.getTime());
alarmBuffer.add(Calendar.SECOND, ALARM_FIRE_BUFFER);
if (currentTime.before(alarmBuffer)) {
setFiredState(context, instance);
} else {
setMissedState(context, instance);
}
} else if (instance.mAlarmState == AlarmInstance.SNOOZE_STATE) {
// We only want to display snooze notification and not update the time,
// so handle showing the notification directly
AlarmNotifications.showSnoozeNotification(context, instance, instance.getAlarmTime());
scheduleInstanceStateChange(context, instance.getAlarmTime(), instance, AlarmInstance.FIRED_STATE);
} else if (currentTime.after(highNotificationTime)) {
setHighNotificationState(context, instance);
/*} else if (currentTime.after(lowNotificationTime)) {
// Only show low notification if it wasn't hidden in the past
if (instance.mAlarmState == AlarmInstance.HIDE_NOTIFICATION_STATE) {
setHideNotificationState(context, instance);
} else {
setLowNotificationState(context, instance);
}*/
} else if (instance.mPreAlarm && currentTime.after(preAlarmTime)) {
setPreFiredState(context, instance);
} else if (instance.mAlarmState == AlarmInstance.PRE_ALARM_DISMISS_STATE) {
setPreFiredDismissState(context, instance);
} else {
// Alarm is still active, so initialize as a silent alarm
setSilentState(context, instance);
}
// The caller prefers to handle updateNextAlarm for optimization
if (updateNextAlarm) {
updateNextAlarm(context);
}
}
use of org.omnirom.deskclock.provider.Alarm in project android_packages_apps_OmniClock by omnirom.
the class AlarmStateManager method updateParentAlarm.
/**
* Used by dismissed and missed states, to update parent alarm. This will either
* disable, delete or reschedule parent alarm.
*
* @param context application context
* @param instance to update parent for
*/
private static void updateParentAlarm(Context context, AlarmInstance instance) {
ContentResolver cr = context.getContentResolver();
Alarm alarm = Alarm.getAlarm(cr, instance.mAlarmId);
if (alarm == null) {
LogUtils.e("Parent has been deleted with instance: " + instance.toString());
return;
}
if (!alarm.daysOfWeek.isRepeating()) {
if (alarm.deleteAfterUse) {
LogUtils.i("Deleting parent alarm: " + alarm.id);
Alarm.deleteAlarm(cr, alarm.id);
} else {
LogUtils.i("Disabling parent alarm: " + alarm.id);
alarm.enabled = false;
Alarm.updateAlarm(cr, alarm);
}
} else {
// This is a optimization for really old alarm instances. This prevent us
// from scheduling and dismissing alarms up to current time.
Calendar currentTime = Calendar.getInstance();
Calendar alarmTime = instance.getAlarmTime();
if (currentTime.after(alarmTime)) {
alarmTime = currentTime;
}
AlarmInstance nextRepeatedInstance = alarm.createInstanceAfter(alarmTime);
LogUtils.i("Creating new instance for repeating alarm " + alarm.id + " at " + sdf.format(nextRepeatedInstance.getAlarmTime().getTime()));
AlarmInstance.addInstance(cr, nextRepeatedInstance);
registerInstance(context, nextRepeatedInstance, true);
}
}
use of org.omnirom.deskclock.provider.Alarm in project android_packages_apps_OmniClock by omnirom.
the class AlarmRingtoneDialog method selectRingtone.
private void selectRingtone(int mediaType) {
if (mediaType == ALARM_TYPE_SPOTIFY) {
if (Utils.isSpotifyPluginInstalled(getActivity())) {
Alarm testAlarm = new Alarm();
saveChanges(testAlarm);
// ignore pre alarm here - spotify activities assume it stored in there
testAlarm.alert = mRingtone;
startActivityForResult(Utils.getSpotifyBrowseIntent(getActivity(), testAlarm), REQUEST_CODE_SPOTIFY);
} else {
showSpotifyErrorDialog();
}
} else if (mediaType == ALARM_TYPE_BROWSE) {
launchBrowseActivity();
} else if (mediaType == ALARM_TYPE_FOLDER) {
launchStoragePicker();
}
}
use of org.omnirom.deskclock.provider.Alarm in project android_packages_apps_OmniClock by omnirom.
the class AlarmRingtoneDialog method onStart.
@Override
public void onStart() {
super.onStart();
AlertDialog d = (AlertDialog) getDialog();
if (d != null) {
Button testButton = (Button) d.getButton(Dialog.BUTTON_NEUTRAL);
testButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// save into temp for testing
Alarm testAlarm = new Alarm();
saveChanges(testAlarm);
showAlarmTestDialog(testAlarm, mPreAlarm);
}
});
}
}
Aggregations