/* * Copyright (C) 2014 AChep@xda <artemchep@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package com.achep.acdisplay.ui.preferences; import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import com.achep.acdisplay.Config; import com.achep.acdisplay.R; import com.achep.base.ui.preferences.MaterialDialogPreference; import com.afollestad.materialdialogs.MaterialDialog; import java.lang.ref.SoftReference; /** * Preference to configure the size of collapsed views. * * @author Artem Chepurnoy */ public class IconSizePreference extends MaterialDialogPreference implements SeekBar.OnSeekBarChangeListener { private static final String TAG = "IconSizePreference"; private final String mValueLabel; private SoftReference<String>[] mSoftStoredLabels; private int mMin; private SeekBar mSeekBar; private TextView mValueTextView; private LinearLayout mContainer; public IconSizePreference(Context context, AttributeSet attrs) { super(context, attrs); mValueLabel = context.getResources().getString(R.string.preference_icon_size_dpi); } @NonNull @Override public MaterialDialog onBuildDialog(@NonNull MaterialDialog.Builder builder) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); Resources res = getContext().getResources(); MaterialDialog md = builder .customView(R.layout.preference_dialog_size, false) .build(); final int max = res.getInteger(R.integer.config_icon_size_max_dp); mMin = res.getInteger(R.integer.config_icon_size_min_dp); mSoftStoredLabels = new SoftReference[max + 1 - mMin]; Config config = Config.getInstance(); View root = md.getCustomView(); assert root != null; mContainer = (LinearLayout) root.findViewById(R.id.container); mValueTextView = (TextView) root.findViewById(R.id.info); mSeekBar = (SeekBar) root.findViewById(R.id.seek_bar); mSeekBar.setOnSeekBarChangeListener(this); mSeekBar.setMax(max - mMin); mSeekBar.setProgress(config.getIconSize(Config.ICON_SIZE_DP) - mMin); // Init preview for (int i = 0; i < 3; i++) { View view = inflater.inflate(R.layout.notification_icon, mContainer, false); view.setBackgroundColor(res.getColor(R.color.selector_pressed_dark)); ImageView icon = (ImageView) view.findViewById(R.id.icon); icon.setImageResource(R.drawable.stat_notify); TextView text = (TextView) view.findViewById(R.id.number); text.setText(Integer.toString(i * 3)); mContainer.addView(view); } onStopTrackingTouch(mSeekBar); return md; } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (!positiveResult) { return; } // Save changes to config. Config config = Config.getInstance(); config.setIconSizeDp(getContext(), mSeekBar.getProgress() + mMin, null); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) { // Store labels to soft references array // to prevent lots of new strings. String label; SoftReference<String> cached = mSoftStoredLabels[progress]; if (cached == null || cached.get() == null) { label = String.format(mValueLabel, Integer.toString(progress + mMin)); mSoftStoredLabels[progress] = new SoftReference<>(label); } else { label = cached.get(); } mValueTextView.setText(label); } @Override public void onStartTrackingTouch(SeekBar seekBar) { /* unused */ } @Override public void onStopTrackingTouch(SeekBar seekBar) { // Update the preview of the collapsed views // list. float density = getContext().getResources().getDisplayMetrics().density; int size = Math.round((seekBar.getProgress() + mMin) * density); int length = mContainer.getChildCount(); for (int i = 0; i < length; i++) { View child = mContainer.getChildAt(i); ViewGroup.LayoutParams lp = child.getLayoutParams(); lp.height = size; lp.width = size; child.setLayoutParams(lp); } } }