blob: 1e7bf28ae8d312821fbb2c8b475403bd16678e31 [file] [log] [blame]
/*
* Copyright (C) 2020 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.ringtone;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.InstrumentationRegistry;
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.rule.ActivityTestRule;
import com.android.deskclock.ItemAdapter;
import com.android.deskclock.ItemAdapter.ItemHolder;
import com.android.deskclock.R;
import com.android.deskclock.Utils;
import com.android.deskclock.data.DataModel;
import com.android.deskclock.provider.Alarm;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Iterator;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* Exercise the user interface that adjusts the selected ringtone.
*/
@RunWith(AndroidJUnit4ClassRunner.class)
public class RingtonePickerActivityTest {
private RingtonePickerActivity activity;
private RecyclerView ringtoneList;
private ItemAdapter<ItemHolder<Uri>> ringtoneAdapter;
public static final Uri ALERT = Uri.parse("content://settings/system/alarm_alert");
public static final Uri CUSTOM_RINGTONE_1 = Uri.parse("content://media/external/audio/one.ogg");
@Rule
public ActivityTestRule<RingtonePickerActivity> rule =
new ActivityTestRule<>(RingtonePickerActivity.class, true, false);
@Before
@After
public void setUp() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().clear().commit();
}
@Test
public void validateDefaultState_TimerRingtonePicker() {
createTimerRingtonePickerActivity();
final List<ItemHolder<Uri>> systemRingtoneHolders = ringtoneAdapter.getItems();
final Iterator<ItemHolder<Uri>> itemsIter = systemRingtoneHolders.iterator();
final HeaderHolder filesHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.your_sounds, filesHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, filesHeaderHolder.getItemViewType());
final AddCustomRingtoneHolder addNewHolder = (AddCustomRingtoneHolder) itemsIter.next();
assertEquals(AddCustomRingtoneViewHolder.VIEW_TYPE_ADD_NEW, addNewHolder.getItemViewType());
final HeaderHolder systemHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.device_sounds, systemHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, systemHeaderHolder.getItemViewType());
final RingtoneHolder silentHolder = (RingtoneHolder) itemsIter.next();
assertEquals(Utils.RINGTONE_SILENT, silentHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, silentHolder.getItemViewType());
final RingtoneHolder defaultHolder = (RingtoneHolder) itemsIter.next();
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, defaultHolder.getItemViewType());
Runnable assertRunnable = () -> {
assertEquals("Silent", silentHolder.getName());
assertEquals("Timer Expired", defaultHolder.getName());
assertEquals(DataModel.getDataModel().getDefaultTimerRingtoneUri(),
defaultHolder.getUri());
// Verify initial selection.
assertEquals(
DataModel.getDataModel().getTimerRingtoneUri(),
DataModel.getDataModel().getDefaultTimerRingtoneUri());
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(assertRunnable);
}
@Test
public void validateDefaultState_AlarmRingtonePicker() {
createAlarmRingtonePickerActivity(ALERT);
final List<ItemHolder<Uri>> systemRingtoneHolders = ringtoneAdapter.getItems();
final Iterator<ItemHolder<Uri>> itemsIter = systemRingtoneHolders.iterator();
final HeaderHolder filesHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.your_sounds, filesHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, filesHeaderHolder.getItemViewType());
final AddCustomRingtoneHolder addNewHolder = (AddCustomRingtoneHolder) itemsIter.next();
assertEquals(AddCustomRingtoneViewHolder.VIEW_TYPE_ADD_NEW, addNewHolder.getItemViewType());
final HeaderHolder systemHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.device_sounds, systemHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, systemHeaderHolder.getItemViewType());
final RingtoneHolder silentHolder = (RingtoneHolder) itemsIter.next();
assertEquals(Utils.RINGTONE_SILENT, silentHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, silentHolder.getItemViewType());
final RingtoneHolder defaultHolder = (RingtoneHolder) itemsIter.next();
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, defaultHolder.getItemViewType());
Runnable assertRunnable = () -> {
assertEquals("Silent", silentHolder.getName());
assertEquals("Default alarm sound", defaultHolder.getName());
assertEquals(DataModel.getDataModel().getDefaultAlarmRingtoneUri(),
defaultHolder.getUri());
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(assertRunnable);
}
@Test
public void validateDefaultState_TimerRingtonePicker_WithCustomRingtones() {
Runnable customRingtoneRunnable = () -> {
DataModel.getDataModel().addCustomRingtone(CUSTOM_RINGTONE_1, "CustomSound");
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(customRingtoneRunnable);
createTimerRingtonePickerActivity();
final List<ItemHolder<Uri>> systemRingtoneHolders = ringtoneAdapter.getItems();
final Iterator<ItemHolder<Uri>> itemsIter = systemRingtoneHolders.iterator();
final HeaderHolder filesHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.your_sounds, filesHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, filesHeaderHolder.getItemViewType());
final CustomRingtoneHolder customRingtoneHolder = (CustomRingtoneHolder) itemsIter.next();
assertEquals("CustomSound", customRingtoneHolder.getName());
assertEquals(CUSTOM_RINGTONE_1, customRingtoneHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_CUSTOM_SOUND,
customRingtoneHolder.getItemViewType());
final AddCustomRingtoneHolder addNewHolder = (AddCustomRingtoneHolder) itemsIter.next();
assertEquals(AddCustomRingtoneViewHolder.VIEW_TYPE_ADD_NEW, addNewHolder.getItemViewType());
final HeaderHolder systemHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.device_sounds, systemHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, systemHeaderHolder.getItemViewType());
final RingtoneHolder silentHolder = (RingtoneHolder) itemsIter.next();
assertEquals(Utils.RINGTONE_SILENT, silentHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, silentHolder.getItemViewType());
final RingtoneHolder defaultHolder = (RingtoneHolder) itemsIter.next();
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, defaultHolder.getItemViewType());
Runnable assertRunnable = () -> {
assertEquals("Silent", silentHolder.getName());
assertEquals("Timer Expired", defaultHolder.getName());
assertEquals(DataModel.getDataModel().getDefaultTimerRingtoneUri(),
defaultHolder.getUri());
// Verify initial selection.
assertEquals(
DataModel.getDataModel().getTimerRingtoneUri(),
DataModel.getDataModel().getDefaultTimerRingtoneUri());
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(assertRunnable);
Runnable removeCustomRingtoneRunnable = () -> {
DataModel.getDataModel().removeCustomRingtone(CUSTOM_RINGTONE_1);
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(removeCustomRingtoneRunnable);
}
@Test
public void validateDefaultState_AlarmRingtonePicker_WithCustomRingtones() {
Runnable customRingtoneRunnable = () -> {
DataModel.getDataModel().addCustomRingtone(CUSTOM_RINGTONE_1, "CustomSound");
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(customRingtoneRunnable);
createAlarmRingtonePickerActivity(ALERT);
final List<ItemHolder<Uri>> systemRingtoneHolders = ringtoneAdapter.getItems();
final Iterator<ItemHolder<Uri>> itemsIter = systemRingtoneHolders.iterator();
final HeaderHolder filesHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.your_sounds, filesHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, filesHeaderHolder.getItemViewType());
final CustomRingtoneHolder customRingtoneHolder = (CustomRingtoneHolder) itemsIter.next();
assertEquals("CustomSound", customRingtoneHolder.getName());
assertEquals(CUSTOM_RINGTONE_1, customRingtoneHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_CUSTOM_SOUND,
customRingtoneHolder.getItemViewType());
final AddCustomRingtoneHolder addNewHolder = (AddCustomRingtoneHolder) itemsIter.next();
assertEquals(AddCustomRingtoneViewHolder.VIEW_TYPE_ADD_NEW, addNewHolder.getItemViewType());
final HeaderHolder systemHeaderHolder = (HeaderHolder) itemsIter.next();
assertEquals(R.string.device_sounds, systemHeaderHolder.getTextResId());
assertEquals(HeaderViewHolder.VIEW_TYPE_ITEM_HEADER, systemHeaderHolder.getItemViewType());
final RingtoneHolder silentHolder = (RingtoneHolder) itemsIter.next();
assertEquals(Utils.RINGTONE_SILENT, silentHolder.getUri());
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, silentHolder.getItemViewType());
final RingtoneHolder defaultHolder = (RingtoneHolder) itemsIter.next();
assertEquals(RingtoneViewHolder.VIEW_TYPE_SYSTEM_SOUND, defaultHolder.getItemViewType());
Runnable assertRunnable = () -> {
assertEquals("Silent", silentHolder.getName());
assertEquals("Default alarm sound", defaultHolder.getName());
assertEquals(DataModel.getDataModel().getDefaultAlarmRingtoneUri(),
defaultHolder.getUri());
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(assertRunnable);
Runnable removeCustomRingtoneRunnable = () -> {
DataModel.getDataModel().removeCustomRingtone(CUSTOM_RINGTONE_1);
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(removeCustomRingtoneRunnable);
}
private void createTimerRingtonePickerActivity() {
final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
final Intent newIntent = new Intent();
Runnable createIntentRunnable = () -> {
final Intent intent = RingtonePickerActivity.createTimerRingtonePickerIntent(context);
newIntent.fillIn(intent, 0);
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(createIntentRunnable);
createRingtonePickerActivity(newIntent);
}
private void createAlarmRingtonePickerActivity(Uri ringtone) {
final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
final Intent newIntent = new Intent();
Runnable createIntentRunnable = () -> {
// Use the custom ringtone in some alarms.
final Alarm alarm = new Alarm(1, 1);
alarm.enabled = true;
alarm.vibrate = true;
alarm.alert = ringtone;
alarm.deleteAfterUse = true;
final Intent intent =
RingtonePickerActivity.createAlarmRingtonePickerIntent(context, alarm);
newIntent.fillIn(intent, 0);
};
InstrumentationRegistry.getInstrumentation().runOnMainSync(createIntentRunnable);
createRingtonePickerActivity(newIntent);
}
@SuppressWarnings("unchecked")
private void createRingtonePickerActivity(Intent intent) {
activity = rule.launchActivity(intent);
ringtoneList = activity.findViewById(R.id.ringtone_content);
ringtoneAdapter = (ItemAdapter<ItemHolder<Uri>>) ringtoneList.getAdapter();
}
}