Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6672e6d authored by James Lemieux's avatar James Lemieux Committed by Android (Google) Code Review
Browse files

Merge "Alarms created from external intents use default ringtone" into ub-deskclock-charm

parents 4e56ce62 6a59a7b2
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -324,8 +324,11 @@
    <!-- Setting title for changing the alarm volume. -->
    <string name="alarm_volume_title">Alarm volume</string>

    <!-- Summary for the alarm preference when silent is chosen. -->
    <string name="silent_alarm_summary">Silent</string>
    <!-- Title for the silent ringtone. -->
    <string name="silent_ringtone_title">Silent</string>

    <!-- Title for ringtones that cannot be located by uri. -->
    <string name="unknown_ringtone_title">Unknown</string>

    <!-- Text to display in the small text of the notification -->
    <string name="alarm_notify_text">Snooze or dismiss alarm.</string>
+31 −16
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.app.LoaderManager;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -32,10 +34,10 @@ import android.widget.Toast;

import com.android.deskclock.alarms.AlarmTimeClickHandler;
import com.android.deskclock.alarms.AlarmUpdateHandler;
import com.android.deskclock.alarms.RingtoneDataManager;
import com.android.deskclock.alarms.ScrollHandler;
import com.android.deskclock.alarms.TimePickerCompat;
import com.android.deskclock.alarms.dataadapter.AlarmTimeAdapter;
import com.android.deskclock.data.DataModel;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.widget.EmptyViewController;

@@ -65,7 +67,6 @@ public final class AlarmClockFragment extends DeskClockFragment implements
    private AlarmTimeAdapter mAlarmTimeAdapter;
    private AlarmUpdateHandler mAlarmUpdateHandler;
    private EmptyViewController mEmptyViewController;
    private RingtoneDataManager mRingtoneDataManager;
    private AlarmTimeClickHandler mAlarmTimeClickHandler;
    private LinearLayoutManager mLayoutManager;

@@ -93,12 +94,11 @@ public final class AlarmClockFragment extends DeskClockFragment implements

        mAlarmUpdateHandler = new AlarmUpdateHandler(getActivity(), this,
                (ViewGroup) v.findViewById(R.id.undo_frame));
        mRingtoneDataManager = new RingtoneDataManager(this, savedState, mAlarmUpdateHandler);
        mEmptyViewController = new EmptyViewController(mMainLayout, mRecyclerView,
                v.findViewById(R.id.alarms_empty_view));
        mAlarmTimeClickHandler = new AlarmTimeClickHandler(this, savedState, mRingtoneDataManager,
                mAlarmUpdateHandler, this);
        mAlarmTimeAdapter = new AlarmTimeAdapter(getActivity(), savedState, mRingtoneDataManager,
        mAlarmTimeClickHandler = new AlarmTimeClickHandler(this, savedState, mAlarmUpdateHandler,
                this);
        mAlarmTimeAdapter = new AlarmTimeAdapter(getActivity(), savedState,
                mAlarmTimeClickHandler, this);
        mRecyclerView.setAdapter(mAlarmTimeAdapter);

@@ -151,7 +151,6 @@ public final class AlarmClockFragment extends DeskClockFragment implements
        super.onSaveInstanceState(outState);
        mAlarmTimeAdapter.saveInstance(outState);
        mAlarmTimeClickHandler.saveInstance(outState);
        mRingtoneDataManager.saveInstance(outState);
    }

    @Override
@@ -226,17 +225,33 @@ public final class AlarmClockFragment extends DeskClockFragment implements

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }

        switch (requestCode) {
            case R.id.request_code_ringtone:
                    mRingtoneDataManager.saveRingtoneUri(
                            mAlarmTimeClickHandler.getSelectedAlarm(), data);
                // Extract the selected ringtone uri.
                Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                if (uri == null) {
                    uri = Alarm.NO_RINGTONE_URI;
                }

                // Update the default ringtone for future new alarms.
                DataModel.getDataModel().setDefaultAlarmRingtoneUri(uri);

                // Set the ringtone uri on the alarm.
                final Alarm alarm = mAlarmTimeClickHandler.getSelectedAlarm();
                alarm.alert = uri;

                // Save the change to alarm.
                mAlarmUpdateHandler.asyncUpdateAlarm(alarm, false /* popToast */,
                        true /* minorUpdate */);
                break;
            default:
                LogUtils.w("Unhandled request code in onActivityResult: " + requestCode);
        }
    }
    }

    @Override
    public void setSmoothScrollStableId(long stableId) {
+6 −6
Original line number Diff line number Diff line
@@ -300,13 +300,13 @@ public class HandleApiCalls extends Activity {
        alarm.daysOfWeek = daysOfWeek;
        alarm.vibrate = vibrate;

        if (alert == null) {
            alarm.alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        } else if (AlarmClock.VALUE_RINGTONE_SILENT.equals(alert) || alert.isEmpty()) {
        if (alert != null) {
            if (AlarmClock.VALUE_RINGTONE_SILENT.equals(alert) || alert.isEmpty()) {
                alarm.alert = Alarm.NO_RINGTONE_URI;
            } else {
                alarm.alert = Uri.parse(alert);
            }
        }
        alarm.deleteAfterUse = !daysOfWeek.isRepeating() && skipUi;

        final ContentResolver cr = getContentResolver();
+1 −9
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.format.DateFormat;

import com.android.deskclock.LabelDialogFragment;
@@ -44,7 +43,6 @@ public final class AlarmTimeClickHandler {
    private static final String KEY_PREVIOUS_DAY_MAP = "previousDayMap";

    private final Fragment mFragment;
    private final RingtoneDataManager mRingtoneDataManager;
    private final AlarmUpdateHandler mAlarmUpdateHandler;
    private final ScrollHandler mScrollHandler;

@@ -53,10 +51,8 @@ public final class AlarmTimeClickHandler {
    private int[] mDayOrder;

    public AlarmTimeClickHandler(Fragment fragment, Bundle savedState,
            RingtoneDataManager ringtoneDataManager, AlarmUpdateHandler alarmUpdateHandler,
            ScrollHandler smoothScrollController) {
            AlarmUpdateHandler alarmUpdateHandler, ScrollHandler smoothScrollController) {
        mFragment = fragment;
        mRingtoneDataManager = ringtoneDataManager;
        mAlarmUpdateHandler = alarmUpdateHandler;
        mScrollHandler = smoothScrollController;
        if (savedState != null) {
@@ -184,10 +180,6 @@ public final class AlarmTimeClickHandler {
        if (mSelectedAlarm == null) {
            // If mSelectedAlarm is null then we're creating a new alarm.
            final Alarm a = new Alarm();
            a.alert = mRingtoneDataManager.getDefaultRingtoneUri();
            if (a.alert == null) {
                a.alert = Settings.System.DEFAULT_ALARM_ALERT_URI;
            }
            a.hour = hourOfDay;
            a.minutes = minute;
            a.enabled = true;
+0 −122
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.deskclock.alarms;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;

import com.android.deskclock.LogUtils;
import com.android.deskclock.provider.Alarm;

/**
 * Data manager for alarm ringtone.
 */
public final class RingtoneDataManager {

    private static final String KEY_RINGTONE_TITLE_CACHE = "ringtoneTitleCache";
    private static final String PREF_KEY_DEFAULT_ALARM_RINGTONE_URI = "default_alarm_ringtone_uri";

    private final Bundle mCache; // Key: ringtone uri, value: ringtone title
    private final Context mAppContext;
    private final AlarmUpdateHandler mAlarmUpdateHandler;

    public RingtoneDataManager(Fragment fragment, Bundle savedState,
            AlarmUpdateHandler alarmUpdateHandler) {
        mAppContext = fragment.getActivity().getApplicationContext();
        mAlarmUpdateHandler = alarmUpdateHandler;
        Bundle cache = null;
        if (savedState != null) {
            cache = savedState.getBundle(KEY_RINGTONE_TITLE_CACHE);
        }
        mCache = cache == null ? new Bundle() : cache;
    }

    public void saveInstance(Bundle outState) {
        outState.putBundle(KEY_RINGTONE_TITLE_CACHE, mCache);
    }

    /**
     * Get ringtone title from cache.
     *
     * @param uri The uri of the ringtone.
     * @return The ringtone title. {@literal null} if no matching ringtone found.
     */
    public String getRingtoneTitle(Uri uri) {
        // Try the cache first
        String title = mCache.getString(uri.toString());
        if (title == null) {
            // This is slow because a media player is created during Ringtone object creation.
            final Ringtone ringTone = RingtoneManager.getRingtone(mAppContext, uri);
            if (ringTone == null) {
                LogUtils.i("No ringtone for uri %s", uri.toString());
                return null;
            }
            title = ringTone.getTitle(mAppContext);

            if (title != null) {
                mCache.putString(uri.toString(), title);
            }
        }
        return title;
    }

    /**
     * Gets the default alarm ringtone uri.
     */
    public Uri getDefaultRingtoneUri() {
        final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mAppContext);
        final String ringtoneUriString = sp.getString(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI, null);

        final Uri ringtoneUri;
        if (ringtoneUriString != null) {
            ringtoneUri = Uri.parse(ringtoneUriString);
        } else {
            ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(mAppContext,
                    RingtoneManager.TYPE_ALARM);
        }

        return ringtoneUri;
    }

    /**
     * Saves ringtone for an alarm.
     */
    public void saveRingtoneUri(Alarm alarm, Intent intent) {
        Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        if (uri == null) {
            uri = Alarm.NO_RINGTONE_URI;
        }
        alarm.alert = uri;

        // Save the last selected ringtone as the default for new alarms
        final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mAppContext);
        if (uri == null) {
            sp.edit().remove(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI).apply();
        } else {
            sp.edit().putString(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI, uri.toString()).apply();
        }

        mAlarmUpdateHandler.asyncUpdateAlarm(alarm, false, true);
    }
}
 No newline at end of file
Loading