package edu.berkeley.cs.amplab.carat.android.subscreens; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import edu.berkeley.cs.amplab.carat.android.CaratApplication; import edu.berkeley.cs.amplab.carat.android.Constants; import edu.berkeley.cs.amplab.carat.android.MainActivity; import edu.berkeley.cs.amplab.carat.android.R; import edu.berkeley.cs.amplab.carat.android.fragments.ExtendedTitleFragment; import edu.berkeley.cs.amplab.carat.android.sampling.SamplingLibrary; import edu.berkeley.cs.amplab.carat.android.storage.SimpleHogBug; import edu.berkeley.cs.amplab.carat.android.ui.DrawView; import edu.berkeley.cs.amplab.carat.android.utils.Tracker; import edu.berkeley.cs.amplab.carat.thrift.DetailScreenReport; import edu.berkeley.cs.amplab.carat.thrift.Reports; public class AppDetailsFragment extends ExtendedTitleFragment { private SimpleHogBug fullObject; private boolean isApp = false; private boolean isOs = false; private double ev, error, evWithout, errorWo; private int samplesCount, samplesCountWithout; private static AppDetailsFragment instance = null; private final MainActivity mMainActivity = CaratApplication.getMainActivity(); /* * @Param type the type of the details we would like to display. Supported * values are: TYPE.OS, TYPE.MODEL, TYPE.OTHER. To specify that we'd like to * show the details of a erroneous app (bug or hog), pass the type BUG as * the first argument. Pass TYPE.OS for OS details and TYPE.MODEL for device * details. */ public static AppDetailsFragment getInstance(Constants.Type type, SimpleHogBug fullObject, boolean isBugs) { if (instance == null) instance = new AppDetailsFragment(); setInstanceFields(type, fullObject, isBugs); return instance; } private static void setInstanceFields(Constants.Type type, SimpleHogBug fullObject, boolean isBugs) { switch (type) { case BUG: instance.isApp = true; instance.isOs = false; instance.setFullObject(fullObject); break; case OS: instance.isApp = false; instance.isOs = true; break; case MODEL: instance.isApp = false; instance.isOs = false; break; default: throw new IllegalArgumentException("only the types BUG, OS, or MODEL can be passed"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View detailsPage = inflater.inflate(R.layout.graph, container, false); DrawView drawView = new DrawView(getActivity()); if (isApp) { drawView.setParams(fullObject, detailsPage); setBenefitTextView(detailsPage, fullObject.getBenefitText()); } else { // isOS or isModel Reports reports = CaratApplication.storage.getReports(); if (reports != null) { Tracker tracker = Tracker.getInstance(); if (isOs) { setOsWidgets(detailsPage, drawView, reports, tracker); } else { // isModel setModelWidgets(detailsPage, drawView, reports, tracker); } // common piece of code for both OS and Model setBenefitWidget(detailsPage); } Log.d("NullReports", "Reports are null!!!"); } // common piece of code for App, OS, and Model setDescriptionWidgets(detailsPage); // onCreateView() should return the view resulting from inflating the // layout file return detailsPage; } private void setOsWidgets(View detailsPage, DrawView drawView, Reports reports, Tracker tracker) { DetailScreenReport os = reports.getOs(); DetailScreenReport osWithout = reports.getOsWithout(); String label = getString(R.string.os) + ": " + SamplingLibrary.getOsVersion(); setDetails(os, osWithout); drawView.setParams(Constants.Type.OS, label, ev, evWithout, samplesCount, samplesCountWithout, error, errorWo, detailsPage); Log.v("OsInfo", "Os score: " + os.getScore()); tracker.trackUser("osInfo"); } private void setModelWidgets(View detailsPage, DrawView drawView, Reports reports, Tracker tracker) { DetailScreenReport model = reports.getModel(); DetailScreenReport modelWithout = reports.getModelWithout(); String label = getString(R.string.model) + ": " + SamplingLibrary.getModel(); setDetails(model, modelWithout); drawView.setParams(Constants.Type.MODEL, label, ev, evWithout, samplesCount, samplesCountWithout, error, errorWo, detailsPage); Log.v("ModelInfo", "Model score: " + model.getScore()); tracker.trackUser("deviceInfo"); } private void setBenefitWidget(View detailsPage) { String benefitText = SimpleHogBug.getBenefitText(ev, error, evWithout, errorWo); if (benefitText == null) benefitText = getString(R.string.jsna); ((TextView) detailsPage.findViewById(R.id.benefit)).setText(benefitText); } private void setBenefitTextView(View detailsPage, String benefit) { TextView tv1 = (TextView) detailsPage.findViewById(R.id.benefit); tv1.setText(benefit); } /* * when user taps on either the more info arrow or the expected improvement * value (at top), the description screen shows up */ private void setDescriptionWidgets(View detailsPage) { View moreinfo = detailsPage.findViewById(R.id.jscore_info); View benefit = detailsPage.findViewById(R.id.benefit); moreinfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mMainActivity.showHTMLFile("detailinfo", getString(R.string.moreinfo), false); } }); benefit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mMainActivity.showHTMLFile("detailinfo", getString(R.string.moreinfo), false); } }); } private void setDetails(DetailScreenReport obj, DetailScreenReport objWithout) { this.ev = obj.getExpectedValue(); this.error = obj.getError(); this.evWithout = objWithout.getExpectedValue(); this.errorWo = objWithout.getError(); this.samplesCount = (int) obj.getSamples(); this.samplesCountWithout = (int) objWithout.getSamples(); } public void setFullObject(SimpleHogBug fullObject) { this.fullObject = fullObject; } }