summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/FontDialogPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/FontDialogPreference.java')
-rw-r--r--src/com/android/settings/FontDialogPreference.java156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/com/android/settings/FontDialogPreference.java b/src/com/android/settings/FontDialogPreference.java
new file mode 100644
index 0000000..e9906e0
--- /dev/null
+++ b/src/com/android/settings/FontDialogPreference.java
@@ -0,0 +1,156 @@
+package com.android.settings;
+
+import android.app.ActivityManagerNative;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.RemoteException;
+import android.preference.DialogPreference;
+import android.preference.Preference;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+public class FontDialogPreference extends DialogPreference
+ implements SeekBar.OnSeekBarChangeListener {
+
+ private TextView mDescriptionText;
+ private TextView mPercentageText;
+ private IntervalSeekBar mSeekBar;
+
+ private DisplayMetrics mDisplayMetrics;
+ private int mLargeTextSp;
+ private int mSmallTextSp;
+
+ public FontDialogPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ setPositiveButtonText(android.R.string.ok);
+ setNegativeButtonText(android.R.string.cancel);
+
+ initDisplayMetrics();
+
+ setDialogLayoutResource(R.layout.preference_dialog_fontsize);
+ setDialogTitle(null); // Hide the title bar
+ }
+
+ @Override
+ protected View onCreateDialogView() {
+ LayoutInflater inflater =
+ (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.preference_dialog_fontsize, null);
+
+ mDescriptionText = (TextView) view.findViewById(R.id.description);
+ mPercentageText = (TextView) view.findViewById(R.id.percentage);
+
+ // Calculate original sp sizes for the text views
+ mLargeTextSp = Math.round(mDescriptionText.getTextSize() / mDisplayMetrics.scaledDensity);
+ mSmallTextSp = Math.round(mPercentageText.getTextSize() / mDisplayMetrics.scaledDensity);
+
+ mSeekBar = (IntervalSeekBar) view.findViewById(R.id.font_size);
+
+ String strFontSize = getPersistedString(String.valueOf(mSeekBar.getDefault()));
+ float fontSize = Float.parseFloat(strFontSize);
+
+ mSeekBar.setProgressFloat(fontSize);
+ mSeekBar.setOnSeekBarChangeListener(this);
+
+ setPrompt(fontSize);
+
+ return view;
+ }
+
+ private void initDisplayMetrics() {
+ DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
+ mDisplayMetrics = new DisplayMetrics();
+ mDisplayMetrics.density = metrics.density;
+ mDisplayMetrics.heightPixels = metrics.heightPixels;
+ mDisplayMetrics.scaledDensity = metrics.scaledDensity;
+ mDisplayMetrics.widthPixels = metrics.widthPixels;
+ mDisplayMetrics.xdpi = metrics.xdpi;
+ mDisplayMetrics.ydpi = metrics.ydpi;
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ if (positiveResult) {
+ // Notify the Display settings screen (parent) that the font size
+ // is about to change. This can determine whether to persist the
+ // current value
+ if (callChangeListener(mSeekBar.getProgressFloat())) {
+ // Originally font scaling was a float stored as a String,
+ // so using persistFloat raises a ClassCastException
+ persistString(Float.toString(mSeekBar.getProgressFloat()));
+ }
+ }
+ }
+
+ @Override
+ protected void onClick() {
+ // Ignore this until an explicit call to click()
+ }
+
+ public void click() {
+ super.onClick();
+ }
+
+ /**
+ * Get an approximate description for the font size scale.
+ * Assumes that the string arrays entries_font_size and
+ * entryvalues_font_size have the same length and correspond to each other
+ * i.e. they are in the same order.
+ */
+ static String getFontSizeDescription(Resources r, float val) {
+ String[] names = r.getStringArray(R.array.entries_font_size);
+ String[] indices = r.getStringArray(R.array.entryvalues_font_size);
+
+ float lastVal = Float.parseFloat(indices[0]);
+ for (int i = 1; i < indices.length; i++) {
+ float thisVal = Float.parseFloat(indices[i]);
+ if (val < (lastVal + (thisVal-lastVal)*.5f)) {
+ return names[i - 1];
+ }
+ lastVal = thisVal;
+ }
+ return names[indices.length - 1];
+ }
+
+ /**
+ * Set the TextView indicating the font scaling
+ */
+ private void setPrompt(float fontScaling) {
+ // Update the preview text
+ String percentage = Math.round(fontScaling * 100) + "%";
+ mPercentageText.setText(percentage);
+
+ // Update the preview sizes
+ mDisplayMetrics.scaledDensity = mDisplayMetrics.density * fontScaling;
+ float largeSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, mLargeTextSp,
+ mDisplayMetrics);
+ float smallSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, mSmallTextSp,
+ mDisplayMetrics);
+ mDescriptionText.setTextSize(TypedValue.COMPLEX_UNIT_PX, largeSize);
+ mPercentageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, smallSize);
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ setPrompt(mSeekBar.getProgressFloat());
+ }
+
+ // Not used
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+}