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
17package com.android.deskclock.ringtone;
18
19import android.graphics.PorterDuff;
20import android.support.v4.content.ContextCompat;
21import android.view.ContextMenu;
22import android.view.LayoutInflater;
23import android.view.Menu;
24import android.view.View;
25import android.view.ViewGroup;
26import android.widget.ImageView;
27import android.widget.TextView;
28
29import com.android.deskclock.AnimatorUtils;
30import com.android.deskclock.ItemAdapter;
31import com.android.deskclock.R;
32import com.android.deskclock.ThemeUtils;
33import com.android.deskclock.Utils;
34
35import static android.view.View.GONE;
36import static android.view.View.OnClickListener;
37import static android.view.View.OnCreateContextMenuListener;
38import static android.view.View.VISIBLE;
39
40final class RingtoneViewHolder extends ItemAdapter.ItemViewHolder<RingtoneHolder>
41        implements OnClickListener, OnCreateContextMenuListener {
42
43    static final int VIEW_TYPE_SYSTEM_SOUND = R.layout.ringtone_item_sound;
44    static final int VIEW_TYPE_CUSTOM_SOUND = -R.layout.ringtone_item_sound;
45    static final int CLICK_NORMAL = 0;
46    static final int CLICK_LONG_PRESS = -1;
47    static final int CLICK_NO_PERMISSIONS = -2;
48
49    private final View mSelectedView;
50    private final TextView mNameView;
51    private final ImageView mImageView;
52
53    private RingtoneViewHolder(View itemView) {
54        super(itemView);
55        itemView.setOnClickListener(this);
56
57        mSelectedView = itemView.findViewById(R.id.sound_image_selected);
58        mNameView = (TextView) itemView.findViewById(R.id.ringtone_name);
59        mImageView = (ImageView) itemView.findViewById(R.id.ringtone_image);
60    }
61
62    @Override
63    protected void onBindItemView(RingtoneHolder itemHolder) {
64        mNameView.setText(itemHolder.getName());
65        final boolean opaque = itemHolder.isSelected() || !itemHolder.hasPermissions();
66        mNameView.setAlpha(opaque ? 1f : .63f);
67        mImageView.setAlpha(opaque ? 1f : .63f);
68        mImageView.clearColorFilter();
69
70        final int itemViewType = getItemViewType();
71        if (itemViewType == VIEW_TYPE_CUSTOM_SOUND) {
72            if (!itemHolder.hasPermissions()) {
73                mImageView.setImageResource(R.drawable.ic_ringtone_not_found);
74                final int colorAccent = ThemeUtils.resolveColor(itemView.getContext(),
75                        R.attr.colorAccent);
76                mImageView.setColorFilter(colorAccent, PorterDuff.Mode.SRC_ATOP);
77            } else {
78                mImageView.setImageResource(R.drawable.placeholder_album_artwork);
79            }
80        } else if (itemHolder.item == Utils.RINGTONE_SILENT) {
81            mImageView.setImageResource(R.drawable.ic_ringtone_silent);
82        } else if (itemHolder.isPlaying()) {
83            mImageView.setImageResource(R.drawable.ic_ringtone_active);
84        } else {
85            mImageView.setImageResource(R.drawable.ic_ringtone);
86        }
87        AnimatorUtils.startDrawableAnimation(mImageView);
88
89        mSelectedView.setVisibility(itemHolder.isSelected() ? VISIBLE : GONE);
90
91        final int bgColorId = itemHolder.isSelected() ? R.color.white_08p : R.color.transparent;
92        itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), bgColorId));
93
94        if (itemViewType == VIEW_TYPE_CUSTOM_SOUND) {
95            itemView.setOnCreateContextMenuListener(this);
96        }
97    }
98
99    @Override
100    public void onClick(View view) {
101        if (getItemHolder().hasPermissions()) {
102            notifyItemClicked(RingtoneViewHolder.CLICK_NORMAL);
103        } else {
104            notifyItemClicked(RingtoneViewHolder.CLICK_NO_PERMISSIONS);
105        }
106    }
107
108    @Override
109    public void onCreateContextMenu(ContextMenu contextMenu, View view,
110            ContextMenu.ContextMenuInfo contextMenuInfo) {
111        notifyItemClicked(RingtoneViewHolder.CLICK_LONG_PRESS);
112        contextMenu.add(Menu.NONE, 0, Menu.NONE, R.string.remove_sound);
113    }
114
115    public static class Factory implements ItemAdapter.ItemViewHolder.Factory {
116
117        private final LayoutInflater mInflater;
118
119        Factory(LayoutInflater inflater) {
120            mInflater = inflater;
121        }
122
123        @Override
124        public ItemAdapter.ItemViewHolder<?> createViewHolder(ViewGroup parent, int viewType) {
125            final View itemView = mInflater.inflate(R.layout.ringtone_item_sound, parent, false);
126            return new RingtoneViewHolder(itemView);
127        }
128    }
129}
130