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