package hu.taxi.lamp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.util.List; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint.Cap; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; @Copyright("2011, Ferenc Takács, Budapest, Hungary") @Author("Ferenc Takács (takacs.ferenc.bp@freemail.hu)") public class LampActivity extends Activity { final float maxlight = 1f; final float minlight = 0.01f; float light = maxlight; boolean flash=false; boolean flashable=false; boolean screen=true; boolean cameraOn=false; Camera camera; MyView view; boolean CameraOn(){ if(cameraOn) return true; try { camera = Camera.open(); if( camera==null) throw new IOException(); } catch (IOException e) { return false; } cameraOn = true; return true; } void CameraOff(){ if(cameraOn) camera.release(); cameraOn = false; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log.i(); GetIni(); flashable = Flashable(); if(!flashable) flash=false; view = new MyView(this); setContentView(view); setBrightness(light); if(flash){ CameraOn(); FlashBrightness(light); } } @Override protected void onPause(){ log.i(); setBrightness(-1); if(flash)CameraOff(); super.onPause(); } @Override protected void onResume(){ log.i(); setBrightness(light); if(flash) { CameraOn(); FlashBrightness(light); } super.onResume(); } @Override protected void onDestroy(){ log.i(); SaveIni(); super.onDestroy(); } void setBrightness(float brightness) { log.i(""+brightness); WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = brightness; getWindow().setAttributes(lp); } public boolean Flashable() { if( !CameraOn() ) return false; Camera.Parameters params = camera.getParameters(); List is = params.getSupportedFlashModes(); if(is==null){ CameraOff(); return false; } for(String i:is) if(i.startsWith("torch")) { log.i("torch"); CameraOff(); return true; } CameraOff(); return false; } public void FlashBrightness() { if(!flashable) return; Camera.Parameters params = camera.getParameters(); List is = params.getSupportedFlashModes(); if(is!=null){ for(String i:is) if(i.startsWith("off")) { log.i("off"); params.setFlashMode(i); camera.setParameters(params); } } } public void FlashBrightness(float light) { if(!flashable) return; Camera.Parameters params; log.i("torch"); params = camera.getParameters(); try { params.getInt("brightness"); int min = params.getInt("brightness-min"); int max = params.getInt("brightness-max"); if(max>min) { int a = (int)(min+light*(max-min)); params.set("brightness",a); // led brightness, maybe not functioned } } catch (NumberFormatException e){ } params.setFlashMode("torch"); camera.setParameters(params); if(exists()) write(""+(int)(light*128)+"\n"); // HTC led brightness } String PATH = "/sys/devices/platform/flashlight.0/leds/flashlight/brightness"; boolean exists() { File f = new File(PATH); return f.exists() && f.canWrite() && !android.os.Build.DEVICE.equals("passion"); } void write(String content) { File f = new File(PATH); try { BufferedWriter out = new BufferedWriter(new FileWriter(f)); out.write(content); out.close(); } catch(IOException ex){} } void GetIni(){ try { FileInputStream f = openFileInput("ini"); flash = f.read()==1?true:false; flashable = f.read()==1?true:false; screen = f.read()==1?true:false; light = (float)f.read()/255.0f; f.close(); } catch (FileNotFoundException e){} catch (IOException e){} } void SaveIni(){ try { FileOutputStream f = openFileOutput("ini", 0); f.write(flash?1:0); f.write(flashable?1:0); f.write(screen?1:0); f.write((int)(light*255)); f.close(); } catch (FileNotFoundException e){} catch (IOException e){} } } class MyView extends View { private Pointf first,second,thirth,fourth; private boolean multitouch = false; RectF dst = null; private Paint p; private float y; final float rad = 60; Pointf pos = new Pointf(0,0); Bitmap light,screen; Rect lightR,screenR; LampActivity act; public MyView(LampActivity context) { super(context); log.i(); act = context; light = BitmapFactory.decodeResource(getResources(),act.flashable?R.drawable.led:R.drawable.noled); screen = BitmapFactory.decodeResource(getResources(),R.drawable.screen); } @Override protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); log.i(); dst = new RectF(0, 0, w, h); y = 5*h/6; p = new Paint(); int x = w/2; int y2 = (int) (2*y/3); lightR = new Rect(x-light.getWidth()-10,y2,x-10,y2+light.getHeight()); screenR = new Rect(x+10,y2,x+screen.getWidth()+10,y2+screen.getHeight()); } @Override protected void onDraw(Canvas c) { log.i(""+act.light); p.setColor(act.screen?0xffffffff:0xff000000); p.setStyle(Paint.Style.FILL); c.drawRect(dst, p); // entire screen p.setStrokeWidth(30); p.setColor(0x60c0c0c0); p.setStrokeCap(Cap.ROUND); c.drawLine(rad,y, dst.right-rad, y, p); // slider pos.set(rad+(act.light-act.minlight)*(dst.right-2*rad)/(act.maxlight-act.minlight),y); c.drawCircle(pos.x, pos.y, rad, p); // slider button c.drawBitmap(light, lightR.left, lightR.top, null); c.drawBitmap(screen, screenR.left, screenR.top, null); super.onDraw(c); } @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()){ case MotionEvent.ACTION_DOWN: // first touch case MotionEvent.ACTION_POINTER_DOWN: // second touch when remained below the not first fourth = thirth; thirth = second; second = first; first = new Pointf(event.getX(0),event.getY(0)); if( first!=null && second!=null && thirth==null ) multitouch = true; break; case MotionEvent.ACTION_POINTER_2_DOWN: // second touch when first pressed // or third touch when remained below the not second fourth = thirth; thirth = second; second = new Pointf(event.getX(1),event.getY(1)); if( first!=null && second!=null && thirth==null ) multitouch = true; break; case MotionEvent.ACTION_POINTER_3_DOWN: fourth = thirth; thirth = new Pointf(event.getX(2),event.getY(2)); break; case 773: // MotionEvent.ACTION_POINTER_4_DOWN: fourth = new Pointf(event.getX(3),event.getY(3)); break; case 774: // MotionEvent.ACTION_POINTER_4_UP: fourth = null; break; case MotionEvent.ACTION_POINTER_3_UP: thirth = fourth; fourth = null; if( first!=null && second!=null && thirth==null ) multitouch = true; break; case MotionEvent.ACTION_POINTER_2_UP: second = thirth; thirth = fourth; fourth = null; if( first!=null && second!=null && thirth==null ) multitouch = true; break; case MotionEvent.ACTION_POINTER_UP : first = second; second = thirth; thirth = fourth; fourth = null; if( first!=null && second!=null && thirth==null ) multitouch = true; break; case MotionEvent.ACTION_UP: if( !multitouch ) { float old = act.light; Pointf cur = new Pointf(event.getX(0),event.getY(0)); if( first.distance(pos) < rad ){ // move slider button act.light += (act.maxlight-act.minlight)*(cur.x-first.x)/(dst.right-2*rad); } else if( first.distance(cur) < 20 && Math.abs(first.y-y) act.maxlight ) act.light = act.maxlight; else if( act.light < act.minlight ) act.light = act.minlight; act.setBrightness(act.light); if(act.flash) { act.FlashBrightness(act.light); } invalidate(); } } multitouch = false; first = second = thirth = fourth = null; break; case MotionEvent.ACTION_MOVE : break; } return true; } } class Pointf extends PointF { public Pointf(float x, float y) { super(x,y); } public Pointf() { super(); } float distance(Pointf p){ float tx=p.x-x; float ty=p.y-y; return length(tx,ty); } } class log extends lg { public static void v(String s){ lg.log(VV.V,s); } public static void v(){ lg.log(VV.V,null); } public static void d(String s){ lg.log(VV.D,s); } public static void d(){ lg.log(VV.D,null); } public static void w(String s){ lg.log(VV.W,s); } public static void w(){ lg.log(VV.W,null); } public static void e(String s){ lg.log(VV.E,s); } public static void e(){ lg.log(VV.E,null); } public static void i(String s){ lg.log(VV.I,s); } public static void i(){ lg.log(VV.I,null); } } class lg { private static final String PREFIX = "## "; // for easy filtering static final boolean debug = true; enum VV {V,D,W,E,I}; static private StackTraceElement stack() { Throwable e = new Throwable(); StackTraceElement[] ss = e.getStackTrace(); return ss[3]; } public static void log(VV a, String s) { if(!debug ) return; StackTraceElement ss = stack(); String msg = PREFIX + ss.getMethodName(); if(s!=null) msg += " " + s; switch(a){ case V: Log.v(ss.getClassName(), msg); break; case D: Log.v(ss.getClassName(), msg); break; case W: Log.v(ss.getClassName(), msg); break; case E: Log.v(ss.getClassName(), msg); break; case I: Log.v(ss.getClassName(), msg); break; } } } @interface Author { String value(); } @interface Copyright { String value(); }