package com.naman14.stools.fragments; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.GridLayout; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.naman14.stools.R; import com.naman14.stools.SToolsApp; import com.naman14.stools.cpu.CpuStateMonitor; import com.naman14.stools.cpu.CpuStateMonitor.CpuState; import com.naman14.stools.cpu.CpuStateMonitor.CpuStateMonitorException; import java.util.ArrayList; import java.util.List; /** * Created by naman on 30/01/15. */ public class CpuFragment extends Fragment { public CpuFragment(){} private SToolsApp _app = null; private GridLayout _uiStatesView = null; private TextView _uiAdditionalStates = null; private TextView _uiTotalStateTime = null; private TextView _uiHeaderAdditionalStates = null; private TextView _uiHeaderTotalStateTime = null; private TextView _uiStatesWarning = null; private TextView _uiKernelString = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); final View v = inflater.inflate(R.layout.fragment_cpu, container, false); _app = (SToolsApp)getActivity().getApplicationContext(); setHasOptionsMenu(true); updateData(); return v; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); findViews(); setHasOptionsMenu(true); } @Override public void onResume () { super.onResume(); updateView(); } private void findViews() { _uiStatesView = (GridLayout)getView().findViewById(R.id.ui_states_view); _uiKernelString = (TextView)getView().findViewById(R.id.ui_kernel_string); _uiAdditionalStates = (TextView)getView().findViewById( R.id.ui_additional_states); _uiHeaderAdditionalStates = (TextView)getView().findViewById( R.id.ui_header_additional_states); _uiHeaderTotalStateTime = (TextView)getView().findViewById( R.id.ui_header_total_state_time); _uiStatesWarning = (TextView)getView().findViewById(R.id.ui_states_warning); _uiTotalStateTime = (TextView)getView().findViewById(R.id.ui_total_state_time); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.home_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh: updateData(); updateView(); break; case R.id.menu_reset: try { _app.getCpuStateMonitor().setOffsets(); } catch (CpuStateMonitor.CpuStateMonitorException e) { // TODO: something } _app.saveOffsets(); updateView(); break; case R.id.menu_restore: _app.getCpuStateMonitor().removeOffsets(); _app.saveOffsets(); updateView(); break; } return true; } public void updateView() { CpuStateMonitor monitor = _app.getCpuStateMonitor(); _uiStatesView.removeAllViews(); List<String> extraStates = new ArrayList<String>(); for (CpuStateMonitor.CpuState state : monitor.getStates()) { if (state.duration > 0) { generateStateRow(state, _uiStatesView); } else { if (state.freq == 0) { extraStates.add(getActivity().getString(R.string.cpu_deep_sleep)); } else { extraStates.add(state.freq/1000 + " MHz"); } } } if ( monitor.getStates().size() == 0) { _uiStatesWarning.setVisibility(View.VISIBLE); _uiHeaderTotalStateTime.setVisibility(View.GONE); _uiTotalStateTime.setVisibility(View.GONE); _uiStatesView.setVisibility(View.GONE); } long totTime = monitor.getTotalStateTime() / 100; _uiTotalStateTime.setText(sToString(totTime)); if (extraStates.size() > 0) { int n = 0; String str = ""; for (String s : extraStates) { if (n++ > 0) str += ", "; str += s; } _uiAdditionalStates.setVisibility(View.VISIBLE); _uiHeaderAdditionalStates.setVisibility(View.VISIBLE); _uiAdditionalStates.setText(str); } else { _uiAdditionalStates.setVisibility(View.GONE); _uiHeaderAdditionalStates.setVisibility(View.GONE); } _uiKernelString.setText(_app.getKernelVersion()); } public void updateData() { CpuStateMonitor monitor = _app.getCpuStateMonitor(); try { monitor.updateStates(); } catch (CpuStateMonitorException e) { } } private static String sToString(long tSec) { long h = (long)Math.floor(tSec / (60*60)); long m = (long)Math.floor((tSec - h*60*60) / 60); long s = tSec % 60; String sDur; sDur = h + ":"; if (m < 10) sDur += "0"; sDur += m + ":"; if (s < 10) sDur += "0"; sDur += s; return sDur; } private View generateStateRow(CpuState state, ViewGroup parent) { LayoutInflater inf = LayoutInflater.from((Context)_app); LinearLayout theRow = (LinearLayout)inf.inflate( R.layout.state_row, parent, false); CpuStateMonitor monitor = _app.getCpuStateMonitor(); float per = (float)state.duration * 100 / monitor.getTotalStateTime(); String sPer = (int)per + "%"; String sFreq; if (state.freq == 0) { sFreq = getActivity().getString(R.string.cpu_deep_sleep); } else { sFreq = state.freq / 1000 + " MHz"; } long tSec = state.duration / 100; String sDur = sToString(tSec); TextView freqText = (TextView)theRow.findViewById(R.id.ui_freq_text); TextView durText = (TextView)theRow.findViewById( R.id.ui_duration_text); TextView perText = (TextView)theRow.findViewById( R.id.ui_percentage_text); ProgressBar bar = (ProgressBar)theRow.findViewById(R.id.ui_bar); freqText.setText(sFreq); freqText.setAnimation(AnimationUtils.loadAnimation(this.getActivity(), R.anim.slide_out)); perText.setText(sPer); perText.setAnimation(AnimationUtils.loadAnimation(this.getActivity(), R.anim.slide_out)); durText.setText(sDur); durText.setAnimation(AnimationUtils.loadAnimation(this.getActivity(), R.anim.slide_out)); bar.setProgress((int)per); parent.addView(theRow); return theRow; } }