/*
 * Copyright (C) 2015 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.applications;

import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.view.ViewGroup.LayoutParams;

import com.android.settings.R;

/**
 * A blank preference that has a specified height by android:layout_height.  It can be used
 * to fine tune screens that combine custom layouts and standard preferences.
 */
public class SpacePreference extends Preference {

    private int mHeight;

    public SpacePreference(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.preferenceStyle);
    }

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

    public SpacePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        setLayoutResource(R.layout.space_preference);

        final TypedArray a = context.obtainStyledAttributes(attrs,
                new int[] { com.android.internal.R.attr.layout_height }, defStyleAttr, defStyleRes);
        mHeight = a.getDimensionPixelSize(0, 0);
    }

    public void setHeight(int height) {
        mHeight = height;
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);

        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mHeight);
        view.itemView.setLayoutParams(params);
    }

}
