package com.eolwral.osmonitor; import java.util.Arrays; import android.app.Activity; import android.content.ContentResolver; import android.graphics.Color; import android.graphics.Point; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import com.sunb.lib.SunGraph.GraphView; import com.sunb.lib.SunGraph.LineInfo; import com.sunb.lib.SunGraph.XYAxisInfo; public class GraphTutorial_cutom extends Activity { /** * GraphView : 그래프 뷰 (현재까지 Line 그래프만 구현됨) * / 모든 기능구현 이전에 성능을 가장 고려하여 설계 * / 다수의 line data 를 Color 로 구분하여 표시 * / 각 line 의 의미 String 표시 * / 각 Axis 의 의미 String 표시 * / View Size 에 따라 flexible 한 좌표계산 및 그래핑 * * ※ 트위로 업뎃 등 관련정보 공유드리며, 버그 및 요청사항도 알려주시면 감사하겠습니다! ^-^ (twitter id : startactivity) * @author 선비(http://likeiron.blog.me/) * @version : 0.1 * @author sunb(heavwind@gmail.com) */ //그래프를 그리는 객체 이다. GraphView mLcdWidget = null; GraphView mCpuWidget = null; GraphView mWifiWidget = null; GraphView m3gWidget = null; GraphView mGpsWidget = null; GraphView mAudioWidget = null; //라인 데이터를 가지고 있다. LineInfo mLcdLine = null; LineInfo mCpuLine = null; LineInfo mWifiLine = null; LineInfo m3gLine = null; LineInfo mGpsLine = null; LineInfo mAudioLine = null; //Thread의 동작 여부를 결정 한다. boolean mStateThread = false; NewsThread thread; ContentResolver cr; //JNI 객체 private static JNIInterface JNILibrary = JNIInterface.getInstance(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.graph); //그래프 불러옵니다. XML에서 크기 등 속성을 변경하실 수 있습니다. mLcdWidget = (GraphView)findViewById(R.id.lcd_graph); mCpuWidget = (GraphView)findViewById(R.id.cpu_graph); mWifiWidget = (GraphView)findViewById(R.id.wifi_graph); m3gWidget = (GraphView)findViewById(R.id.cellular_graph); mGpsWidget = (GraphView)findViewById(R.id.gps_graph); mAudioWidget = (GraphView)findViewById(R.id.audio_graph); //그려질 데이터 생성 float[] initialData = new float[60]; Arrays.fill(initialData, 0, 60, 0); //그려질 Line 정보 구체화. 여기선 Line 2개를 만들어봅니다. /* * @par1 = 라인의 이름으로 Graph 상단에 표시되며 라인간 구별의 역할 * @par2 = 라인의 색깔로 Graph 상단에 라인명과 같이 표시된다. * @par3 = 라인의 두께 * @par4 = 그려질 데이터 */ mLcdLine = new LineInfo("LCD", Color.CYAN, 0, initialData); mCpuLine = new LineInfo("CPU", Color.GREEN, 0, initialData); mWifiLine = new LineInfo("WIFI", Color.BLUE, 0, initialData); m3gLine = new LineInfo("3G", Color.YELLOW, 0, initialData); mGpsLine = new LineInfo("GPS", Color.RED, 0, initialData); mAudioLine = new LineInfo("AUDIO", Color.MAGENTA, 0, initialData); // X/Y 축에대한 정보를 구체화. 맨마지막은 구분선의 색이다. XYAxisInfo LcdAxis = new XYAxisInfo("elapsed time", "LCD(mW)", 0, 2000, 60, new Point(4,4), Color.GRAY); XYAxisInfo CpuAxis = new XYAxisInfo("elapsed time", "CPU(mW)", 0, 1000, 60, new Point(4,4), Color.GRAY); XYAxisInfo WifiAxis = new XYAxisInfo("elapsed time", "WIFI(mW)", 0, 100, 60, new Point(4,4), Color.GRAY); XYAxisInfo CellularAxis = new XYAxisInfo("elapsed time", "3G(mW)", 0, 100, 60, new Point(4,4), Color.GRAY); XYAxisInfo GpsAxis = new XYAxisInfo("elapsed time", "GPSU(mW)", 0, 100, 60, new Point(4,4), Color.GRAY); XYAxisInfo AudioAxis = new XYAxisInfo("elapsed time", "AUDIO(mW)", 0, 100, 60, new Point(4,4), Color.GRAY); //구체화된 객체들로 그래프 초기화 mLcdWidget.CreateXYAxis(LcdAxis); mLcdWidget.AddLine(mLcdLine); //구체화된 객체들로 그래프 초기화 mCpuWidget.CreateXYAxis(CpuAxis); mCpuWidget.AddLine(mCpuLine); //구체화된 객체들로 그래프 초기화 mWifiWidget.CreateXYAxis(WifiAxis); mWifiWidget.AddLine(mWifiLine); //구체화된 객체들로 그래프 초기화 m3gWidget.CreateXYAxis(CellularAxis); m3gWidget.AddLine(m3gLine); //구체화된 객체들로 그래프 초기화 mGpsWidget.CreateXYAxis(GpsAxis); mGpsWidget.AddLine(mGpsLine); //구체화된 객체들로 그래프 초기화 mAudioWidget.CreateXYAxis(AudioAxis); mAudioWidget.AddLine(mAudioLine); //시스템 정보를 얻어오기 위한 리졸버 얻어온다. cr = getContentResolver(); thread = new NewsThread(); thread.start(); // Button btn =(Button)findViewById(R.id.BUTTON); // btn.setOnClickListener(mBtnClickListener); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mStateThread = true; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } OnClickListener mBtnClickListener = new OnClickListener() { public void onClick(View arg0) { thread = new NewsThread(); thread.start(); } }; //핸들러에서 Adapter 데이터가 갱신되었으니 새로 그리라는 명령을 받아 주어야 한다. Handler mHandler = new Handler(){ public void handleMessage(Message msg){ //기존의 라인객체에서 Array 얻어옵니다. float lcdTmp[] = mLcdLine.getLineInnerData(); float cpuTmp[] = mCpuLine.getLineInnerData(); float wifiTmp[] = mWifiLine.getLineInnerData(); float cellTmp[] = m3gLine.getLineInnerData(); float gpsTmp[] = mGpsLine.getLineInnerData(); float audioTmp[] = mAudioLine.getLineInnerData(); // 값을 한단계씩 땡긴다. for(int i=(cpuTmp.length-1); i >0; i--){ cpuTmp[i] = cpuTmp[i-1]; lcdTmp[i] = lcdTmp[i-1]; wifiTmp[i] = wifiTmp[i-1]; cellTmp[i] = cellTmp[i-1]; gpsTmp[i] = gpsTmp[i-1]; } //cpuTmp[0] = JNILibrary.GetCPUUsageValue(); cpuTmp[0] = (float)OSMonitorService.getInstance().mOPowerModelValue.mCPUPower; lcdTmp[0] = (float)OSMonitorService.getInstance().mOPowerModelValue.mLEDPower; if(Settings.System.getInt(cr, Settings.Secure.WIFI_ON, -1)>0){ wifiTmp[0] = 70; } else{ wifiTmp[0] = 0; } if(Settings.System.getInt(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, -1)>0){ gpsTmp[0] = 70; } else{ gpsTmp[0] = 0; } //CPU LOAD 관련이다. //line 객체에 Array 셋팅 mLcdLine.setLineInnerData(lcdTmp); mCpuLine.setLineInnerData(cpuTmp); mWifiLine.setLineInnerData(wifiTmp); m3gLine.setLineInnerData(cellTmp); mGpsLine.setLineInnerData(gpsTmp); mAudioLine.setLineInnerData(audioTmp); // 그래프에 값 반영 mLcdWidget.UpdateLine(mLcdLine); //LCD mCpuWidget.UpdateLine(mCpuLine);//CPU LOAD mWifiWidget.UpdateLine(mWifiLine);//WIFI signal m3gWidget.UpdateLine(m3gLine); mGpsWidget.UpdateLine(mGpsLine); mAudioWidget.UpdateLine(mAudioLine); // screen update mLcdWidget.UpdateAll(); mCpuWidget.UpdateAll(); mWifiWidget.UpdateAll(); m3gWidget.UpdateAll(); mGpsWidget.UpdateAll(); mAudioWidget.UpdateAll(); Log.d("Graph","Handler Response"); } }; //메시지를 주기적으로 발생시키는 Thread 이다. class NewsThread extends Thread { public void run() { while(mStateThread == false){ //핸들러 메시지를 보내서 어뎁터를 MAIN UI Thread에서 갱신하도록 한다. mHandler.sendEmptyMessage(0); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }