Home | History | Annotate | Download | only in ringtone
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.deskclock.ringtone;
     18 
     19 import android.content.AsyncTaskLoader;
     20 import android.content.Context;
     21 import android.database.Cursor;
     22 import android.database.MatrixCursor;
     23 import android.media.RingtoneManager;
     24 import android.net.Uri;
     25 
     26 import com.android.deskclock.ItemAdapter;
     27 import com.android.deskclock.LogUtils;
     28 import com.android.deskclock.R;
     29 import com.android.deskclock.data.CustomRingtone;
     30 import com.android.deskclock.data.DataModel;
     31 
     32 import java.util.ArrayList;
     33 import java.util.List;
     34 
     35 import static android.media.AudioManager.STREAM_ALARM;
     36 import static com.android.deskclock.Utils.RINGTONE_SILENT;
     37 
     38 /**
     39  * Assembles the list of ItemHolders that back the RecyclerView used to choose a ringtone.
     40  */
     41 class RingtoneLoader extends AsyncTaskLoader<List<ItemAdapter.ItemHolder<Uri>>> {
     42 
     43     private final Uri mDefaultRingtoneUri;
     44     private final String mDefaultRingtoneTitle;
     45     private List<CustomRingtone> mCustomRingtones;
     46 
     47     RingtoneLoader(Context context, Uri defaultRingtoneUri, String defaultRingtoneTitle) {
     48         super(context);
     49         mDefaultRingtoneUri = defaultRingtoneUri;
     50         mDefaultRingtoneTitle = defaultRingtoneTitle;
     51     }
     52 
     53     @Override
     54     protected void onStartLoading() {
     55         super.onStartLoading();
     56 
     57         mCustomRingtones = DataModel.getDataModel().getCustomRingtones();
     58         forceLoad();
     59     }
     60 
     61     @Override
     62     public List<ItemAdapter.ItemHolder<Uri>> loadInBackground() {
     63         // Prime the ringtone title cache for later access.
     64         DataModel.getDataModel().loadRingtoneTitles();
     65         DataModel.getDataModel().loadRingtonePermissions();
     66 
     67         // Fetch the standard system ringtones.
     68         final RingtoneManager ringtoneManager = new RingtoneManager(getContext());
     69         ringtoneManager.setType(STREAM_ALARM);
     70 
     71         Cursor systemRingtoneCursor;
     72         try {
     73             systemRingtoneCursor = ringtoneManager.getCursor();
     74         } catch (Exception e) {
     75             LogUtils.e("Could not get system ringtone cursor");
     76             systemRingtoneCursor = new MatrixCursor(new String[] {});
     77         }
     78         final int systemRingtoneCount = systemRingtoneCursor.getCount();
     79         // item count = # system ringtones + # custom ringtones + 2 headers + Add new music item
     80         final int itemCount = systemRingtoneCount + mCustomRingtones.size() + 3;
     81 
     82         final List<ItemAdapter.ItemHolder<Uri>> itemHolders = new ArrayList<>(itemCount);
     83 
     84         // Add the item holder for the Music heading.
     85         itemHolders.add(new HeaderHolder(R.string.your_sounds));
     86 
     87         // Add an item holder for each custom ringtone and also cache a pretty name.
     88         for (CustomRingtone ringtone : mCustomRingtones) {
     89             itemHolders.add(new CustomRingtoneHolder(ringtone));
     90         }
     91 
     92         // Add an item holder for the "Add new" music ringtone.
     93         itemHolders.add(new AddCustomRingtoneHolder());
     94 
     95         // Add an item holder for the Ringtones heading.
     96         itemHolders.add(new HeaderHolder(R.string.device_sounds));
     97 
     98         // Add an item holder for the silent ringtone.
     99         itemHolders.add(new SystemRingtoneHolder(RINGTONE_SILENT, null));
    100 
    101         // Add an item holder for the system default alarm sound.
    102         itemHolders.add(new SystemRingtoneHolder(mDefaultRingtoneUri, mDefaultRingtoneTitle));
    103 
    104         // Add an item holder for each system ringtone.
    105         for (int i = 0; i < systemRingtoneCount; i++) {
    106             final Uri ringtoneUri = ringtoneManager.getRingtoneUri(i);
    107             itemHolders.add(new SystemRingtoneHolder(ringtoneUri, null));
    108         }
    109 
    110         return itemHolders;
    111     }
    112 
    113     @Override
    114     protected void onReset() {
    115         super.onReset();
    116         mCustomRingtones = null;
    117     }
    118 }