1 package org.connectbot.util; 2 3 import android.app.Activity; 4 import android.content.Context; 5 import android.content.SharedPreferences; 6 import android.content.res.Configuration; 7 import android.graphics.Canvas; 8 import android.graphics.Paint; 9 import android.os.Bundle; 10 import android.preference.PreferenceManager; 11 import android.view.Menu; 12 import android.view.MenuItem; 13 import android.view.View; 14 import android.view.ViewGroup; 15 import android.view.MenuItem.OnMenuItemClickListener; 16 import android.view.ViewGroup.LayoutParams; 17 import android.widget.AdapterView; 18 import android.widget.BaseAdapter; 19 import android.widget.GridView; 20 import android.widget.LinearLayout; 21 import android.widget.AdapterView.OnItemClickListener; 22 23 import com.googlecode.android_scripting.R; 24 25 import org.connectbot.util.UberColorPickerDialog.OnColorChangedListener; 26 27 /** 28 * @author modified by raaar 29 */ 30 public class ColorsActivity extends Activity implements OnItemClickListener, OnColorChangedListener { 31 32 private SharedPreferences mPreferences; 33 34 private static int sLayoutLanscapeWidth = 400; 35 private static int sLayoutPortraitWidth = 210; 36 37 private GridView mColorGrid; 38 private LinearLayout mLayout; 39 40 private int mFgColor; 41 private int mBgColor; 42 43 private int mCurrentColor = 0; 44 45 @Override onCreate(Bundle savedInstanceState)46 protected void onCreate(Bundle savedInstanceState) { 47 super.onCreate(savedInstanceState); 48 49 mPreferences = PreferenceManager.getDefaultSharedPreferences(this); 50 51 mFgColor = 52 mPreferences.getInt(PreferenceConstants.COLOR_FG, PreferenceConstants.DEFAULT_FG_COLOR); 53 mBgColor = 54 mPreferences.getInt(PreferenceConstants.COLOR_BG, PreferenceConstants.DEFAULT_BG_COLOR); 55 56 setContentView(R.layout.act_colors); 57 58 this.setTitle("Terminal Colors"); 59 60 mLayout = (LinearLayout) findViewById(R.id.color_layout); 61 62 mColorGrid = (GridView) findViewById(R.id.color_grid); 63 mColorGrid.setOnItemClickListener(this); 64 mColorGrid.setSelection(0); 65 66 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 67 mColorGrid.setNumColumns(2); 68 LayoutParams params = mLayout.getLayoutParams(); 69 params.height = params.width; 70 params.width = LayoutParams.WRAP_CONTENT; 71 } 72 mColorGrid.setAdapter(new ColorsAdapter(true)); 73 74 } 75 76 private class ColorsAdapter extends BaseAdapter { 77 private boolean mSquareViews; 78 ColorsAdapter(boolean squareViews)79 public ColorsAdapter(boolean squareViews) { 80 mSquareViews = squareViews; 81 } 82 getView(int position, View convertView, ViewGroup parent)83 public View getView(int position, View convertView, ViewGroup parent) { 84 ColorView c; 85 if (convertView == null) { 86 c = new ColorView(ColorsActivity.this, mSquareViews); 87 } else { 88 c = (ColorView) convertView; 89 } 90 if (position == 0) { 91 c.setColor(mFgColor); 92 c.setTitle("Foreground color"); 93 } else { 94 c.setColor(mBgColor); 95 c.setTitle("Background color"); 96 } 97 return c; 98 } 99 getCount()100 public int getCount() { 101 return 2; 102 } 103 getItem(int position)104 public Object getItem(int position) { 105 return (position == 0) ? mFgColor : mBgColor; 106 } 107 getItemId(int position)108 public long getItemId(int position) { 109 return position; 110 } 111 } 112 113 private class ColorView extends View { 114 private boolean mSquare; 115 116 private Paint mTextPaint; 117 private Paint mShadowPaint; 118 // Things we paint 119 private int mBackgroundColor; 120 private String mText; 121 122 private int mAscent; 123 private int mWidthCenter; 124 private int mHeightCenter; 125 ColorView(Context context, boolean square)126 public ColorView(Context context, boolean square) { 127 super(context); 128 129 mSquare = square; 130 131 mTextPaint = new Paint(); 132 mTextPaint.setAntiAlias(true); 133 mTextPaint.setTextSize(16); 134 mTextPaint.setColor(0xFFFFFFFF); 135 mTextPaint.setTextAlign(Paint.Align.CENTER); 136 137 mShadowPaint = new Paint(mTextPaint); 138 mShadowPaint.setStyle(Paint.Style.STROKE); 139 mShadowPaint.setStrokeCap(Paint.Cap.ROUND); 140 mShadowPaint.setStrokeJoin(Paint.Join.ROUND); 141 mShadowPaint.setStrokeWidth(4f); 142 mShadowPaint.setColor(0xFF000000); 143 144 setPadding(20, 20, 20, 20); 145 } 146 setColor(int color)147 public void setColor(int color) { 148 mBackgroundColor = color; 149 } 150 setTitle(String title)151 public void setTitle(String title) { 152 mText = title; 153 } 154 155 @Override onMeasure(int widthMeasureSpec, int heightMeasureSpec)156 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 157 int width = measureWidth(widthMeasureSpec); 158 159 int height; 160 if (mSquare) { 161 height = width; 162 } else { 163 height = measureHeight(heightMeasureSpec); 164 } 165 166 mAscent = (int) mTextPaint.ascent(); 167 mWidthCenter = width / 2; 168 mHeightCenter = height / 2 - mAscent / 2; 169 170 setMeasuredDimension(width, height); 171 } 172 measureWidth(int measureSpec)173 private int measureWidth(int measureSpec) { 174 int result = 0; 175 int specMode = MeasureSpec.getMode(measureSpec); 176 int specSize = MeasureSpec.getSize(measureSpec); 177 178 if (specMode == MeasureSpec.EXACTLY) { 179 // We were told how big to be 180 result = specSize; 181 } else { 182 // Measure the text 183 result = (int) mTextPaint.measureText(mText) + getPaddingLeft() + getPaddingRight(); 184 if (specMode == MeasureSpec.AT_MOST) { 185 // Respect AT_MOST value if that was what is called for by 186 // measureSpec 187 result = Math.min(result, specSize); 188 } 189 } 190 191 return result; 192 } 193 measureHeight(int measureSpec)194 private int measureHeight(int measureSpec) { 195 int result = 0; 196 int specMode = MeasureSpec.getMode(measureSpec); 197 int specSize = MeasureSpec.getSize(measureSpec); 198 199 mAscent = (int) mTextPaint.ascent(); 200 if (specMode == MeasureSpec.EXACTLY) { 201 // We were told how big to be 202 result = specSize; 203 } else { 204 // Measure the text (beware: ascent is a negative number) 205 result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop() + getPaddingBottom(); 206 if (specMode == MeasureSpec.AT_MOST) { 207 // Respect AT_MOST value if that was what is called for by 208 // measureSpec 209 result = Math.min(result, specSize); 210 } 211 } 212 return result; 213 } 214 215 @Override onDraw(Canvas canvas)216 protected void onDraw(Canvas canvas) { 217 super.onDraw(canvas); 218 canvas.drawColor(mBackgroundColor); 219 canvas.drawText(mText, mWidthCenter, mHeightCenter, mShadowPaint); 220 canvas.drawText(mText, mWidthCenter, mHeightCenter, mTextPaint); 221 } 222 } 223 editColor(int colorNumber)224 private void editColor(int colorNumber) { 225 mCurrentColor = colorNumber; 226 new UberColorPickerDialog(this, this, (colorNumber == 0) ? mFgColor : mBgColor).show(); 227 } 228 onItemClick(AdapterView<?> parent, View view, int position, long id)229 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 230 editColor(position); 231 } 232 onNothingSelected(AdapterView<?> arg0)233 public void onNothingSelected(AdapterView<?> arg0) { 234 } 235 colorChanged(int value)236 public void colorChanged(int value) { 237 SharedPreferences.Editor editor = mPreferences.edit(); 238 if (mCurrentColor == 0) { 239 mFgColor = value; 240 editor.putInt(PreferenceConstants.COLOR_FG, mFgColor); 241 } else { 242 mBgColor = value; 243 editor.putInt(PreferenceConstants.COLOR_BG, mBgColor); 244 } 245 editor.commit(); 246 mColorGrid.invalidateViews(); 247 } 248 249 @Override onConfigurationChanged(Configuration newConfig)250 public void onConfigurationChanged(Configuration newConfig) { 251 super.onConfigurationChanged(newConfig); 252 if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 253 mColorGrid.setNumColumns(2); 254 LayoutParams params = mLayout.getLayoutParams(); 255 params.height = params.width; 256 params.width = sLayoutLanscapeWidth; 257 } else { 258 mColorGrid.setNumColumns(1); 259 LayoutParams params = mLayout.getLayoutParams(); 260 params.height = LayoutParams.WRAP_CONTENT; 261 params.width = sLayoutPortraitWidth; 262 } 263 } 264 265 @Override onCreateOptionsMenu(Menu menu)266 public boolean onCreateOptionsMenu(Menu menu) { 267 super.onCreateOptionsMenu(menu); 268 MenuItem reset = menu.add("Reset"); 269 reset.setAlphabeticShortcut('r'); 270 reset.setNumericShortcut('1'); 271 reset.setIcon(android.R.drawable.ic_menu_revert); 272 reset.setOnMenuItemClickListener(new OnMenuItemClickListener() { 273 public boolean onMenuItemClick(MenuItem arg0) { 274 mFgColor = PreferenceConstants.DEFAULT_FG_COLOR; 275 mBgColor = PreferenceConstants.DEFAULT_BG_COLOR; 276 SharedPreferences.Editor editor = mPreferences.edit(); 277 editor.putInt(PreferenceConstants.COLOR_FG, mFgColor); 278 editor.putInt(PreferenceConstants.COLOR_BG, mBgColor); 279 editor.commit(); 280 mColorGrid.invalidateViews(); 281 return true; 282 } 283 }); 284 return true; 285 } 286 } 287