/*
 * 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.settings.notification.app;

import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import androidx.annotation.NonNull;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedPreferenceHelper;
import com.android.settingslib.RestrictedPreferenceHelperProvider;

/**
 * A tri-state preference allowing a user to specify what gets to bubble.
 */
public class BubblePreference extends Preference implements RadioGroup.OnCheckedChangeListener,
        RestrictedPreferenceHelperProvider {
    RestrictedPreferenceHelper mHelper;

    private int mSelectedPreference;

    private boolean mSelectedVisible;

    public BubblePreference(Context context) {
        this(context, null);
    }

    public BubblePreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BubblePreference(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public BubblePreference(Context context, AttributeSet attrs,
                            int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mHelper = new RestrictedPreferenceHelper(context, this, attrs);
        mHelper.useAdminDisabledSummary(true);
        setLayoutResource(R.layout.bubble_preference);
    }

    @Override
    public @NonNull RestrictedPreferenceHelper getRestrictedPreferenceHelper() {
        return mHelper;
    }

    public void setSelectedPreference(int preference) {
        mSelectedPreference = preference;
        notifyChanged();
    }

    public int getSelectedPreference() {
        return mSelectedPreference;
    }

    public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
        if (mHelper.setDisabledByAdmin(admin)) {
            notifyChanged();
        }
    }

    public void setSelectedVisibility(boolean visible) {
        if (mSelectedVisible != visible) {
            mSelectedVisible = visible;
            notifyChanged();
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        final boolean disabledByAdmin = mHelper.isDisabledByAdmin();
        View summary = holder.findViewById(android.R.id.summary);
        if (disabledByAdmin) {
            mHelper.onBindViewHolder(holder);
            summary.setVisibility(View.VISIBLE);
        } else {
            summary.setVisibility(View.GONE);
        }
        holder.itemView.setClickable(false);

        RadioButton bubbleAllButton = (RadioButton) holder.findViewById(R.id.bubble_all);
        bubbleAllButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_ALL);
        bubbleAllButton.setTag(BUBBLE_PREFERENCE_ALL);
        bubbleAllButton.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);

        RadioButton bubbleSelectedButton = (RadioButton) holder.findViewById(R.id.bubble_selected);
        bubbleSelectedButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_SELECTED);
        bubbleSelectedButton.setTag(BUBBLE_PREFERENCE_SELECTED);
        int selectedButtonVisibility =
                (!mSelectedVisible || disabledByAdmin) ? View.GONE : View.VISIBLE;
        bubbleSelectedButton.setVisibility(selectedButtonVisibility);

        RadioButton bubbleNoneButton = (RadioButton) holder.findViewById(R.id.bubble_none);
        bubbleNoneButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_NONE);
        bubbleNoneButton.setTag(BUBBLE_PREFERENCE_NONE);
        bubbleNoneButton.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);

        RadioGroup bublesRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_group);
        bublesRadioGroup.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(@NonNull RadioGroup group, int checkedId) {
        View v = group.findViewById(checkedId);
        if (v == null || v.getTag() == null) {
            return;
        }
        int selectedTag = (int) v.getTag();
        callChangeListener(selectedTag);
    }
}
