Search in sources :

Example 6 with Alarm

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();
}
Also used : Intent(android.content.Intent) ImageView(android.widget.ImageView) View(android.view.View) AdapterView(android.widget.AdapterView) SearchView(android.widget.SearchView) TextView(android.widget.TextView) ListView(android.widget.ListView) Alarm(org.omnirom.deskclock.provider.Alarm) TextView(android.widget.TextView) AdapterView(android.widget.AdapterView) ImageView(android.widget.ImageView)

Example 7 with Alarm

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);
    }
}
Also used : Calendar(java.util.Calendar) Alarm(org.omnirom.deskclock.provider.Alarm) ContentResolver(android.content.ContentResolver)

Example 8 with Alarm

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);
    }
}
Also used : AlarmInstance(org.omnirom.deskclock.provider.AlarmInstance) Alarm(org.omnirom.deskclock.provider.Alarm) Calendar(java.util.Calendar) ContentResolver(android.content.ContentResolver)

Example 9 with Alarm

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();
    }
}
Also used : Alarm(org.omnirom.deskclock.provider.Alarm)

Example 10 with Alarm

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);
            }
        });
    }
}
Also used : AlertDialog(android.app.AlertDialog) Button(android.widget.Button) Alarm(org.omnirom.deskclock.provider.Alarm) View(android.view.View) AdapterView(android.widget.AdapterView) TextView(android.widget.TextView)

Aggregations

Alarm (org.omnirom.deskclock.provider.Alarm)11 ContentResolver (android.content.ContentResolver)4 Intent (android.content.Intent)2 View (android.view.View)2 AdapterView (android.widget.AdapterView)2 TextView (android.widget.TextView)2 Calendar (java.util.Calendar)2 AlarmInstance (org.omnirom.deskclock.provider.AlarmInstance)2 AlertDialog (android.app.AlertDialog)1 Context (android.content.Context)1 SharedPreferences (android.content.SharedPreferences)1 Uri (android.net.Uri)1 AsyncTask (android.os.AsyncTask)1 Button (android.widget.Button)1 ImageView (android.widget.ImageView)1 ListView (android.widget.ListView)1 SearchView (android.widget.SearchView)1 ArrayList (java.util.ArrayList)1 DaysOfWeek (org.omnirom.deskclock.provider.DaysOfWeek)1 ActionableToastBar (org.omnirom.deskclock.widget.ActionableToastBar)1