/*
   EditTextPreference to store/load integer values

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
   If a copy of the MPL was not distributed with this file, You can obtain one at
   http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.utils;

import android.content.Context;
import android.content.res.TypedArray;
import androidx.preference.EditTextPreference;
import android.util.AttributeSet;

import com.freerdp.freerdpcore.R;

public class IntEditTextPreference extends EditTextPreference
{

	private int bounds_min, bounds_max, bounds_default;

	public IntEditTextPreference(Context context)
	{
		super(context);
		init(context, null);
	}

	public IntEditTextPreference(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		init(context, attrs);
	}

	public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
		init(context, attrs);
	}

	private void init(Context context, AttributeSet attrs)
	{
		if (attrs != null)
		{
			TypedArray array =
			    context.obtainStyledAttributes(attrs, R.styleable.IntEditTextPreference, 0, 0);
			bounds_min =
			    array.getInt(R.styleable.IntEditTextPreference_bounds_min, Integer.MIN_VALUE);
			bounds_max =
			    array.getInt(R.styleable.IntEditTextPreference_bounds_max, Integer.MAX_VALUE);
			bounds_default = array.getInt(R.styleable.IntEditTextPreference_bounds_default, 0);
			array.recycle();
		}
		else
		{
			bounds_min = Integer.MIN_VALUE;
			bounds_max = Integer.MAX_VALUE;
			bounds_default = 0;
		}
	}

	public void setBounds(int min, int max, int defaultValue)
	{
		bounds_min = min;
		bounds_max = max;
		bounds_default = defaultValue;
	}

	@Override protected String getPersistedString(String defaultReturnValue)
	{
		int value = getPersistedInt(-1);
		if (value > bounds_max || value < bounds_min)
			value = bounds_default;
		return String.valueOf(value);
	}

	@Override protected boolean persistString(String value)
	{
		return persistInt(Integer.parseInt(value));
	}

	@Override public void setText(String text)
	{
		String valueToSave = getText();

		try
		{
			int parsed = Integer.parseInt(text);
			if (parsed >= bounds_min && parsed <= bounds_max)
			{
				valueToSave = text;
			}
		}
		catch (Exception ignored)
		{
		}

		if (valueToSave == null)
		{
			valueToSave = String.valueOf(bounds_default);
		}

		super.setText(valueToSave);
	}
}
