133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux/* 233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * Copyright (C) 2016 The Android Open Source Project 333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * 433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * Licensed under the Apache License, Version 2.0 (the "License"); 533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * you may not use this file except in compliance with the License. 633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * You may obtain a copy of the License at 733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * 833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * http://www.apache.org/licenses/LICENSE-2.0 933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * 1033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * Unless required by applicable law or agreed to in writing, software 1133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * distributed under the License is distributed on an "AS IS" BASIS, 1233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * See the License for the specific language governing permissions and 1433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux * limitations under the License. 1533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux */ 1633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 1733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuxpackage com.android.deskclock.ringtone; 1833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 1995eed3212011413e1cb717c281e2157859a5adf4Sean Stoutimport android.graphics.PorterDuff; 2033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.support.v4.content.ContextCompat; 2133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.view.ContextMenu; 2233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.view.LayoutInflater; 2333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.view.Menu; 2433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.view.View; 2533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.view.ViewGroup; 2633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.widget.ImageView; 2733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport android.widget.TextView; 2833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 2933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport com.android.deskclock.AnimatorUtils; 3033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport com.android.deskclock.ItemAdapter; 3133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport com.android.deskclock.R; 3295eed3212011413e1cb717c281e2157859a5adf4Sean Stoutimport com.android.deskclock.ThemeUtils; 3333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport com.android.deskclock.Utils; 3433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 3533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport static android.view.View.GONE; 3633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport static android.view.View.OnClickListener; 3733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport static android.view.View.OnCreateContextMenuListener; 3833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuximport static android.view.View.VISIBLE; 3933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 4033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieuxfinal class RingtoneViewHolder extends ItemAdapter.ItemViewHolder<RingtoneHolder> 4133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux implements OnClickListener, OnCreateContextMenuListener { 4233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 4333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux static final int VIEW_TYPE_SYSTEM_SOUND = R.layout.ringtone_item_sound; 4433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux static final int VIEW_TYPE_CUSTOM_SOUND = -R.layout.ringtone_item_sound; 4533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux static final int CLICK_NORMAL = 0; 4633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux static final int CLICK_LONG_PRESS = -1; 4795eed3212011413e1cb717c281e2157859a5adf4Sean Stout static final int CLICK_NO_PERMISSIONS = -2; 4833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 4933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux private final View mSelectedView; 5033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux private final TextView mNameView; 5133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux private final ImageView mImageView; 5233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 5333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux private RingtoneViewHolder(View itemView) { 5433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux super(itemView); 5533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux itemView.setOnClickListener(this); 5633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 5733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mSelectedView = itemView.findViewById(R.id.sound_image_selected); 5833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mNameView = (TextView) itemView.findViewById(R.id.ringtone_name); 5933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mImageView = (ImageView) itemView.findViewById(R.id.ringtone_image); 6033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 6133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 6233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux @Override 6333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux protected void onBindItemView(RingtoneHolder itemHolder) { 6433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mNameView.setText(itemHolder.getName()); 6595eed3212011413e1cb717c281e2157859a5adf4Sean Stout final boolean opaque = itemHolder.isSelected() || !itemHolder.hasPermissions(); 6695eed3212011413e1cb717c281e2157859a5adf4Sean Stout mNameView.setAlpha(opaque ? 1f : .63f); 6795eed3212011413e1cb717c281e2157859a5adf4Sean Stout mImageView.setAlpha(opaque ? 1f : .63f); 6895eed3212011413e1cb717c281e2157859a5adf4Sean Stout mImageView.clearColorFilter(); 6933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 7078083dc9f8ca8170a6f312f62d26c49d69b9f0e4Justin Klaassen final int itemViewType = getItemViewType(); 7133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux if (itemViewType == VIEW_TYPE_CUSTOM_SOUND) { 7295eed3212011413e1cb717c281e2157859a5adf4Sean Stout if (!itemHolder.hasPermissions()) { 7395eed3212011413e1cb717c281e2157859a5adf4Sean Stout mImageView.setImageResource(R.drawable.ic_ringtone_not_found); 7495eed3212011413e1cb717c281e2157859a5adf4Sean Stout final int colorAccent = ThemeUtils.resolveColor(itemView.getContext(), 7595eed3212011413e1cb717c281e2157859a5adf4Sean Stout R.attr.colorAccent); 7695eed3212011413e1cb717c281e2157859a5adf4Sean Stout mImageView.setColorFilter(colorAccent, PorterDuff.Mode.SRC_ATOP); 7795eed3212011413e1cb717c281e2157859a5adf4Sean Stout } else { 7895eed3212011413e1cb717c281e2157859a5adf4Sean Stout mImageView.setImageResource(R.drawable.placeholder_album_artwork); 7995eed3212011413e1cb717c281e2157859a5adf4Sean Stout } 8033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } else if (itemHolder.item == Utils.RINGTONE_SILENT) { 8133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mImageView.setImageResource(R.drawable.ic_ringtone_silent); 8233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } else if (itemHolder.isPlaying()) { 8333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mImageView.setImageResource(R.drawable.ic_ringtone_active); 8433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } else { 8533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mImageView.setImageResource(R.drawable.ic_ringtone); 8633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 8733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux AnimatorUtils.startDrawableAnimation(mImageView); 8833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 8933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mSelectedView.setVisibility(itemHolder.isSelected() ? VISIBLE : GONE); 9033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 9133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux final int bgColorId = itemHolder.isSelected() ? R.color.white_08p : R.color.transparent; 9233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), bgColorId)); 9333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 9433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux if (itemViewType == VIEW_TYPE_CUSTOM_SOUND) { 9533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux itemView.setOnCreateContextMenuListener(this); 9633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 9733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 9833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 9933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux @Override 10033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux public void onClick(View view) { 10195eed3212011413e1cb717c281e2157859a5adf4Sean Stout if (getItemHolder().hasPermissions()) { 10295eed3212011413e1cb717c281e2157859a5adf4Sean Stout notifyItemClicked(RingtoneViewHolder.CLICK_NORMAL); 10395eed3212011413e1cb717c281e2157859a5adf4Sean Stout } else { 10495eed3212011413e1cb717c281e2157859a5adf4Sean Stout notifyItemClicked(RingtoneViewHolder.CLICK_NO_PERMISSIONS); 10595eed3212011413e1cb717c281e2157859a5adf4Sean Stout } 10633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 10733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 10833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux @Override 10933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux public void onCreateContextMenu(ContextMenu contextMenu, View view, 11033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux ContextMenu.ContextMenuInfo contextMenuInfo) { 11133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux notifyItemClicked(RingtoneViewHolder.CLICK_LONG_PRESS); 11233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux contextMenu.add(Menu.NONE, 0, Menu.NONE, R.string.remove_sound); 11333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 11433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 11533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux public static class Factory implements ItemAdapter.ItemViewHolder.Factory { 11633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 11733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux private final LayoutInflater mInflater; 11833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 11933781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux Factory(LayoutInflater inflater) { 12033781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux mInflater = inflater; 12133781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 12233781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux 12333781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux @Override 12433781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux public ItemAdapter.ItemViewHolder<?> createViewHolder(ViewGroup parent, int viewType) { 12533781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux final View itemView = mInflater.inflate(R.layout.ringtone_item_sound, parent, false); 12633781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux return new RingtoneViewHolder(itemView); 12733781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 12833781c882e4229f4ec1a8fafbabb9d4b8b8e2932James Lemieux } 12978083dc9f8ca8170a6f312f62d26c49d69b9f0e4Justin Klaassen} 130