/*
 * Copyright (C) 2016 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.storagemanager.deletionhelper;

import android.content.Context;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceViewHolder;
import android.text.format.Formatter;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import com.android.storagemanager.R;

/**
 * NestedCheckboxPreference is a CheckBoxPreference which is nested in to align with a {@link
 * CollapsibleCheckboxPreferenceGroup}.
 */
public class NestedDeletionPreference extends CheckBoxPreference {
    private TextView mSize;
    private long mAppSize;

    public NestedDeletionPreference(Context context) {
        super(context);
        setLayoutResource(com.android.storagemanager.R.layout.preference_nested);
        setWidgetLayoutResource(com.android.storagemanager.R.layout.preference_widget_checkbox);
    }

    @Override
    protected void onClick() {
        super.onClick();
        mSize.setActivated(isChecked());
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        CheckBox checkboxWidget =
                (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
        checkboxWidget.setVisibility(View.VISIBLE);
        mSize = (TextView) holder.findViewById(R.id.deletion_type_size);
        mSize.setActivated(checkboxWidget.isChecked());
        mSize.setText(getItemSize());
    }

    void setItemSize(long itemSize) {
        mAppSize = itemSize;
    }

    public String getItemSize() {
        return Formatter.formatFileSize(getContext(), mAppSize);
    }

}
