package org.hwbot.prime;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import android.annotation.TargetApi;
import android.widget.*;
import android.widget.LinearLayout.LayoutParams;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.hwbot.api.bench.dto.DeviceInfoDTO;
import org.hwbot.api.bench.dto.DeviceRecordDTO;
import org.hwbot.api.bench.dto.DeviceRecordDTO.RecordType;
import org.hwbot.api.bench.dto.DeviceRecordsDTO;
import org.hwbot.api.esports.CompetitionStageDTO;
import org.hwbot.prime.api.CompetitionsStatusAware;
import org.hwbot.prime.api.HardwareRecordsStatusAware;
import org.hwbot.prime.api.HardwareStatusAware;
import org.hwbot.prime.api.SubmissionStatusAware;
import org.hwbot.prime.exception.UnsignedAppException;
import org.hwbot.prime.model.BenchmarkResult;
import org.hwbot.prime.service.AndroidHardwareService;
import org.hwbot.prime.service.BenchService;
import org.hwbot.prime.service.BenchmarkStatusAware;
import org.hwbot.prime.service.SecurityService;
import org.hwbot.prime.service.SubmitResponse;
import org.hwbot.prime.tasks.*;
import org.hwbot.prime.util.AndroidUtil;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.text.TextUtils.TruncateAt;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewSwitcher.ViewFactory;
public class TabFragmentBench extends Fragment implements BenchmarkStatusAware, HardwareStatusAware, SubmissionStatusAware, HardwareRecordsStatusAware, CompetitionsStatusAware {
public static final int POSITION = 0;
// the benchmark
protected View rootView;
protected BenchmarkStatusAware benchUI;
protected SubmissionStatusAware submissionStatusAware;
protected TextSwitcher temperatureStatus;
protected TextSwitcher bestPhoneMe, bestPhone, bestCoreMe, bestCore, bestFamilyMe, bestFamily, bestOverallMe, bestOverall;
private static Handler monitorThreadHandler;
private static Thread monitorThread;
private static Runnable monitorTask;
private static TabFragmentBench fragment;
private AvailableCompetitionsTask availableCompetitionsTask;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Log.i(TabFragmentBench.class.getSimpleName(), "creating tab fragment bench.");
rootView = inflater.inflate(R.layout.fragment_main_bench, container, false);
View benchbutton = rootView.findViewById(R.id.benchbutton);
benchbutton.requestFocus();
benchbutton.setOnClickListener(launchBenchmarkListener);
fragment = this;
benchUI = this;
submissionStatusAware = this;
if (MainActivity.activity != null) {
AndroidUtil.setTextInView(rootView, R.id.tableRowSoC, Build.BOARD);
AndroidUtil.setTextInView(rootView, R.id.tableRowModel, Build.MODEL);
// AndroidUtil.setTextInView(rootView, R.id.tableRowDevice, getResources().getString(R.string.resolving));
// AndroidUtil.setTextInView(rootView, R.id.tableRowProcessor, getResources().getString(R.string.resolving));
// AndroidUtil.setTextInView(rootView, R.id.tableRowVideocard, getResources().getString(R.string.resolving));
// AndroidUtil.setTextInView(rootView, R.id.tableRowMemory, getResources().getString(R.string.resolving));
AndroidUtil.setTextInView(rootView, R.id.tableRowBuild, "Android " + Build.VERSION.RELEASE);
AndroidUtil.setTextInView(rootView, R.id.tableRowKernel, AndroidHardwareService.getInstance().getKernel());
temperatureStatus = (TextSwitcher) rootView.findViewById(R.id.temperatureLabel);
bestCore = (TextSwitcher) rootView.findViewById(R.id.bestCore);
bestCoreMe = (TextSwitcher) rootView.findViewById(R.id.bestCoreMe);
bestFamily = (TextSwitcher) rootView.findViewById(R.id.bestFamily);
bestFamilyMe = (TextSwitcher) rootView.findViewById(R.id.bestFamilyMe);
bestOverall = (TextSwitcher) rootView.findViewById(R.id.bestOverall);
bestOverallMe = (TextSwitcher) rootView.findViewById(R.id.bestOverallMe);
bestPhone = (TextSwitcher) rootView.findViewById(R.id.bestPhone);
bestPhoneMe = (TextSwitcher) rootView.findViewById(R.id.bestPhoneMe);
ViewFactory viewFactory = new ViewFactory() {
public View makeView() {
TextView myText = new TextView(MainActivity.activity, null, R.style.ValueChanging);
myText.setEllipsize(TruncateAt.START);
myText.setGravity(Gravity.LEFT);
myText.setTextAppearance(MainActivity.activity.getApplicationContext(), R.style.ValueChanging);
return myText;
}
};
ViewFactory scoreViewFactory = new ViewFactory() {
public View makeView() {
TextView myText = new TextView(MainActivity.activity, null, R.style.ValueScore);
myText.setEllipsize(TruncateAt.START);
myText.setGravity(Gravity.CENTER_HORIZONTAL);
myText.setTextAppearance(MainActivity.activity.getApplicationContext(), R.style.ValueScore);
return myText;
}
};
temperatureStatus.setFactory(viewFactory);
bestCore.setFactory(scoreViewFactory);
bestCoreMe.setFactory(scoreViewFactory);
bestPhone.setFactory(scoreViewFactory);
bestPhoneMe.setFactory(scoreViewFactory);
bestFamily.setFactory(scoreViewFactory);
bestFamilyMe.setFactory(scoreViewFactory);
bestOverall.setFactory(scoreViewFactory);
bestOverallMe.setFactory(scoreViewFactory);
// Declare the in and out animations and initialize them
Animation in = AnimationUtils.loadAnimation(MainActivity.getActivity(), android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(MainActivity.getActivity(), android.R.anim.fade_out);
bestPhoneMe.setInAnimation(in);
bestPhoneMe.setOutAnimation(out);
bestCoreMe.setInAnimation(in);
bestCoreMe.setOutAnimation(out);
bestFamilyMe.setInAnimation(in);
bestFamilyMe.setOutAnimation(out);
bestOverallMe.setInAnimation(in);
bestOverallMe.setOutAnimation(out);
setScore(bestPhone, (Float) null);
setScore(bestCore, (Float) null);
setScore(bestFamily, (Float) null);
setScore(bestOverall, (Float) null);
setScore(bestPhoneMe, (Float) null);
setScore(bestCoreMe, (Float) null);
setScore(bestFamilyMe, (Float) null);
setScore(bestOverallMe, (Float) null);
// updateOfflineMode();
updateDeviceInfo();
updateShowPersonalRecords();
loadRecordsFromStore();
// cpu load bars
AndroidHardwareService hardwareService = AndroidHardwareService.getInstance();
int cores = hardwareService.getProcessorCores();
TableLayout tableLayout = (TableLayout) rootView.findViewById(R.id.tableHardware);
for (int core = 0; core < cores; core++) {
TextSwitcher frequencyLabel = new TextSwitcher(MainActivity.activity);
frequencyLabel.setFactory(viewFactory);
TableRow tableRow = new TableRow(MainActivity.activity);
TextView textView = new TextView(MainActivity.activity);
textView.setText(" Core #" + (core + 1));
tableRow.addView(textView);
tableRow.addView(frequencyLabel);
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(AndroidUtil.dpToPx(32), 0, 0, 0);
tableLayout.addView(tableRow, (3 + core), layoutParams);
hardwareService.monitorCpuFrequency(core, frequencyLabel);
}
hardwareService.monitorTemperature(temperatureStatus);
restartMonitorCpuFrequency();
rootView.findViewById(R.id.hardwareUnknownButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rootView.findViewById(R.id.hardwareUnknownButton).setVisibility(View.GONE);
rootView.findViewById(R.id.hardwareUnknownAddDescription).setVisibility(View.VISIBLE);
rootView.findViewById(R.id.hardwareUnknownAddButton).setVisibility(View.VISIBLE);
}
});
final TabFragmentBench parent = this;
rootView.findViewById(R.id.hardwareUnknownAddButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rootView.findViewById(R.id.hardwareUnknown).setVisibility(View.GONE);
rootView.findViewById(R.id.hardwareUnknownButton).setVisibility(View.GONE);
rootView.findViewById(R.id.hardwareUnknownAddDescription).setVisibility(View.GONE);
rootView.findViewById(R.id.hardwareUnknownAddButton).setVisibility(View.GONE);
rootView.findViewById(R.id.hardwareUnknownThanks).setVisibility(View.VISIBLE);
HardwareDetectionTask hardwareDetectionTask = new HardwareDetectionTask(MainActivity.activity, parent);
hardwareDetectionTask.execute(Build.MODEL, ((EditText)rootView.findViewById(R.id.hardwareUnknownAddDescription)).getText().toString());
MainActivity.getActivity().setDeviceSubmitted();
}
});
}
return rootView;
}
public void loadRecordsFromStore() {
DeviceRecordsDTO personalDeviceRecords = MainActivity.getActivity().loadPersonalRecords();
if (personalDeviceRecords != null) {
updatePersonalScores(personalDeviceRecords.getRecords());
}
DeviceRecordsDTO deviceRecords = MainActivity.getActivity().loadRecords();
if (deviceRecords != null) {
updateScores(deviceRecords.getRecords());
}
}
public void updateShowPersonalRecords() {
if (rootView != null) {
if (SecurityService.getInstance().isLoggedIn()) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Show my records.");
rootView.findViewById(R.id.myRecords).setVisibility(View.VISIBLE);
} else {
// Log.i(TabFragmentBench.class.getSimpleName(), "Do not show personal records.");
rootView.findViewById(R.id.myRecords).setVisibility(View.GONE);
}
}
}
private void updateDeviceInfo() {
DeviceInfoDTO deviceInfo = MainActivity.activity.loadDeviceInfo();
if (deviceInfo == null || deviceInfo.getId() == null) {
// Log.i(TabFragmentBench.class.getName(), "Submitting hardware detection task...");
HardwareDetectionTask hardwareDetectionTask = new HardwareDetectionTask(MainActivity.activity, this);
hardwareDetectionTask.execute(Build.MODEL);
} else {
// Log.i(TabFragmentBench.class.getName(), "Loaded device info from cache.");
presentDeviceInfo(deviceInfo);
}
}
/**
* Touch listener to use for in-layout UI controls to delay hiding the system UI. This is to prevent the jarring behavior of controls going away while
* interacting with activity UI.
*/
View.OnClickListener launchBenchmarkListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
// Log.i(TabFragmentBench.class.getName(), "Starting benchmark");
Button text = (Button) rootView.findViewById(R.id.benchbutton);
text.setText("Running benchmark...");
// text.refreshDrawableState();
ProgressBar progressbar = (ProgressBar) rootView.findViewById(R.id.progressBar1);
progressbar.setProgress(0);
// Log.i(TabFragmentBench.class.getSimpleName(), "Using benchmark: " + PrimeBenchService.getInstance() + " with progress bar: " + progressbar);
PrimeBenchService.getInstance().initialize(text, progressbar, benchUI);
// Log.i(TabFragmentBench.class.getName(), "Submitting worker...");
BenchmarkTask benchmarkTask = new BenchmarkTask(benchUI, PrimeBenchService.getInstance().instantiateBenchmark());
ExecutorService exec = Executors.newFixedThreadPool(2, new ThreadFactory() {
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
thread.setPriority(Thread.MAX_PRIORITY);
thread.setName("benchmark");
thread.setDaemon(false);
return thread;
}
});
exec.submit(benchmarkTask);
} catch (Exception e) {
e.printStackTrace();
Log.e(TabFragmentBench.class.getName(), "error launching bench: " + e.getMessage());
}
}
};
@Override
public void notifyBenchmarkFinished(final Number score) {
// Log.i(TabFragmentBench.class.getSimpleName(), "New score: " + score);
if (MainActivity.activity != null) {
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// Log.i(TabFragmentBench.class.getSimpleName(), "Displaying score: " + score);
Button text = (Button) rootView.findViewById(R.id.benchbutton);
text.setText(String.format(Locale.ENGLISH, "%.0f Primes Per Second", score));
PrimeBenchService.getInstance().setScore(score.intValue());
// store
boolean best;
try {
best = MainActivity.activity.updateBestScore();
// if (best) {
if (MainActivity.activity.isOfflineMode()) {
MainActivity.toast("Disable offline mode to compare score.");
} else {
// if (AndroidHardwareService.getInstance().getDeviceInfo() != null
// && AndroidHardwareService.getInstance().getDeviceInfo().getProcessorId() != null) {
if (best) {
MainActivity.toast("Personal record! Hooray!");
} else {
BenchmarkResult bestScore = MainActivity.activity.getBestScore();
MainActivity.toast("Not your best." + (bestScore != null ? " Try to beat " + ((int)bestScore.getScore()) : ""));
}
try {
new SubmitResultTask(MainActivity.activity, submissionStatusAware, PrimeBenchService.getInstance().getDataFile(
MainActivity.getActivity().getApplicationContext())).execute((Void) null);
} catch (Exception e) {
Log.e(TabFragmentBench.class.getSimpleName(), "Failed to submit " + e.getMessage());
e.printStackTrace();
}
// } else {
// MainActivity.toast("Personal record!");
// }
}
updateScoreIfBetter(score.floatValue());
// }
} catch (UnsignedAppException e1) {
e1.printStackTrace();
MainActivity.toast("Done! Use production version to compete in leaderboard.");
}
}
});
} else {
Log.e(TabFragmentBench.class.getSimpleName(), "No main activity!");
}
}
public void updateScoreIfBetter(Float score) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Updating score if better: " + score);
setScoreIfBetter(bestPhoneMe, score);
setScoreIfBetter(bestCoreMe, score);
setScoreIfBetter(bestFamilyMe, score);
setScoreIfBetter(bestOverallMe, score);
}
public void updateScores(Map<RecordType, DeviceRecordDTO> hwbotPrimeRecords) {
if (hwbotPrimeRecords != null) {
setScore(bestPhone, hwbotPrimeRecords.get(RecordType.best_device));
setScore(bestCore, hwbotPrimeRecords.get(RecordType.best_cpu_core));
setScore(bestFamily, hwbotPrimeRecords.get(RecordType.best_cpu_family));
setScore(bestOverall, hwbotPrimeRecords.get(RecordType.best_overall_soc));
}
}
public void updatePersonalScores(Map<RecordType, DeviceRecordDTO> hwbotPrimeRecordsPersonal) {
BenchmarkResult bestScore = MainActivity.getActivity().getBestScore();
Float score = (bestScore != null && bestScore.getScore() > 0) ? bestScore.getScore() : null;
if (hwbotPrimeRecordsPersonal != null && !hwbotPrimeRecordsPersonal.isEmpty()) {
// Log.i(TabFragmentBench.class.getSimpleName(), "My records: " + hwbotPrimeRecordsPersonal + " keys: " + hwbotPrimeRecordsPersonal.keySet());
if (hwbotPrimeRecordsPersonal.get(RecordType.best_device) != null) {
if (score == null || score < hwbotPrimeRecordsPersonal.get(RecordType.best_device).getScore()) {
setScore(bestPhoneMe, hwbotPrimeRecordsPersonal.get(RecordType.best_device));
}
}
setScore(bestCoreMe, hwbotPrimeRecordsPersonal.get(RecordType.best_cpu_core));
setScore(bestFamilyMe, hwbotPrimeRecordsPersonal.get(RecordType.best_cpu_family));
setScore(bestOverallMe, hwbotPrimeRecordsPersonal.get(RecordType.best_overall_soc));
}
}
private void setScore(final TextSwitcher switcher, final DeviceRecordDTO score) {
if (score != null) {
if (score.getSubmissionId() != null) {
switcher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(BenchService.SERVER_MOBILE + "/submission/" + score.getSubmissionId()));
MainActivity.activity.startActivity(intent);
}
});
}
setScore(switcher, score.getScore());
} else {
Log.w(TabFragmentBench.class.getSimpleName(), "Score null.");
}
}
private void setScoreIfBetter(TextSwitcher switcher, Float score) {
if (score != null) {
TextView current = (TextView) switcher.getCurrentView();
String value = StringUtils.remove("" + current.getText(), " PPS");
if (getResources().getString(R.string.not_available).equals(value)) {
setScore(switcher, score);
} else if (NumberUtils.isNumber(value)) {
if (Float.parseFloat(value) < score) {
setScore(switcher, score);
}
} else {
setScore(switcher, score);
}
}
}
private void setScore(TextSwitcher switcher, Float score) {
if (score == null) {
switcher.setText(getResources().getString(R.string.not_available));
} else {
String format = String.format(Locale.ENGLISH, "%.0f PPS", score);
switcher.setText(format);
}
}
@Override
public void notifyDeviceInfo(final DeviceInfoDTO deviceInfo) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Device: " + deviceInfo);
AndroidHardwareService.getInstance().setDeviceInfo(deviceInfo);
MainActivity.activity.storeDeviceInfo(deviceInfo);
if (MainActivity.activity != null) {
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
presentDeviceInfo(deviceInfo);
}
});
}
}
@Override
public void notifyDeviceInfoFailed(final Status status) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Failed to load device info: " + status);
if (MainActivity.activity != null) {
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
DeviceInfoDTO storedDeviceInfo = MainActivity.activity.loadDeviceInfo();
if (storedDeviceInfo != null) {
MainActivity.toast("Can't contact HWBOT, using cached info.");
notifyDeviceInfo(storedDeviceInfo);
rootView.findViewById(R.id.myRecords).setVisibility(View.VISIBLE);
rootView.findViewById(R.id.worldRecords).setVisibility(View.VISIBLE);
} else {
switch (status) {
case service_down:
MainActivity.toast("Sorry, HWBOT is unavailable now.");
break;
case no_network:
// MainActivity.toast("No network access...");
break;
case unknown_device:
if (rootView.findViewById(R.id.hardwareUnknownThanks).getVisibility() != View.VISIBLE){
HardwareDetectionTask hardwareDetectionTask = new HardwareDetectionTask(MainActivity.getActivity(), TabFragmentBench.this);
hardwareDetectionTask.execute(getDeviceIdentification());
rootView.findViewById(R.id.myRecords).setVisibility(View.GONE);
rootView.findViewById(R.id.worldRecords).setVisibility(View.GONE);
((TableRow)rootView.findViewById(R.id.tableRowDevice).getParent()).setVisibility(View.GONE);
((TableRow)rootView.findViewById(R.id.tableRowProcessor).getParent()).setVisibility(View.GONE);
((TableRow)rootView.findViewById(R.id.tableRowVideocard).getParent()).setVisibility(View.GONE);
((TableRow)rootView.findViewById(R.id.tableRowMemory).getParent()).setVisibility(View.GONE);
if (!MainActivity.getActivity().isDeviceSubmitted()){
MainActivity.toast("We don't know this phone yet, functionality will be limited. Please let us know which model you have so we can add support?");
rootView.findViewById(R.id.hardwareUnknownButton).setVisibility(View.VISIBLE);
rootView.findViewById(R.id.hardwareUnknown).setVisibility(View.VISIBLE);
}
}
// AndroidUtil.setTextInView(rootView, R.id.tableRowDevice, "unknown");
// AndroidUtil.setTextInView(rootView, R.id.tableRowProcessor, "unknown");
// AndroidUtil.setTextInView(rootView, R.id.tableRowVideocard, "unknown");
// AndroidUtil.setTextInView(rootView, R.id.tableRowMemory, "unknown");
default:
break;
}
}
}
});
}
}
@Override
public void notifySubmissionDone(SubmitResponse response) {
if (response != null) {
if (response.isSuccess()) {
// Log.i(TabFragmentBench.class.getSimpleName(), response.toString());
MainActivity.getActivity().markBestScoreSubmitted();
} else {
if (org.apache.commons.lang.StringUtils.isNotEmpty(response.getMessage())) {
MainActivity.toast(response.getMessage());
} else {
MainActivity.toast("Sorry, can not contact HWBOT. :(");
}
Log.e(TabFragmentBench.class.getSimpleName(), "Communication error: " + response.getTechnicalMessage());
}
} else {
MainActivity.toast("Communication with HWBOT failed. :(");
}
}
// monitor
public void startMonitor() {
// Log.i(TabFragmentBench.class.getSimpleName(), "Restarting hardware monitor.");
monitorThreadHandler = new Handler();
monitorTask = new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//Do time consuming stuff
//The handler schedules the new runnable on the UI thread
monitorThreadHandler.post(AndroidHardwareService.getInstance());
//Add some downtime
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Stopping monitoring task...");
Thread.currentThread().interrupt();
}
}
// Log.i(TabFragmentBench.class.getSimpleName(), "Stopped monitoring task.");
}
};
monitorThread = new Thread(monitorTask);
monitorThread.start();
}
public void stopMonitorCpuFrequency() {
try {
if (monitorTask != null) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Stop monitor task.");
monitorThreadHandler.removeCallbacks(AndroidHardwareService.getInstance());
monitorThread.interrupt();
monitorTask = null;
}
} catch (Exception e) {
Log.e(TabFragmentBench.class.getSimpleName(), "Failed to stop monitoring task.");
}
}
public void restartMonitorCpuFrequency() {
try {
if (monitorTask != null) {
stopMonitorCpuFrequency();
}
startMonitor();
} catch (Exception e) {
e.printStackTrace();
}
}
public void presentDeviceInfo(final DeviceInfoDTO deviceInfo) {
if (deviceInfo != null && deviceInfo.getId() != null) {
if (SecurityService.getInstance().isLoggedIn()) {
rootView.findViewById(R.id.myRecords).setVisibility(View.VISIBLE);
}
rootView.findViewById(R.id.worldRecords).setVisibility(View.VISIBLE);
if (TabFragmentCompare.getInstance() != null) {
TabFragmentCompare.getInstance().showLeaderboardIfDeviceInfoPresent();
}
// MainActivity.toast("Hardware detected. Benchmark to analyze.");
if (deviceInfo.getId() != null) {
if (MainActivity.getActivity().loadRecords() == null) {
new HardwareRecordsTask(MainActivity.getActivity(), TabFragmentBench.getInstance(), deviceInfo.getId(), null).execute((Void) null);
}
if (SecurityService.getInstance().isLoggedIn() && MainActivity.getActivity().loadPersonalRecords() == null) {
new HardwareRecordsTask(MainActivity.getActivity(), TabFragmentBench.getInstance(), deviceInfo.getId(), SecurityService.getInstance()
.getCredentials().getUserId()).execute((Void) null);
}
}
AndroidUtil.setTextInView(rootView, R.id.tableRowDevice,
(deviceInfo.getName() != null ? deviceInfo.getName() : getResources().getString(R.string.unknown)));
AndroidUtil.setTextInView(rootView, R.id.tableRowProcessor, (deviceInfo.getProcessor() != null ? deviceInfo.getProcessor() : getResources()
.getString(R.string.unknown)));
AndroidUtil.setTextInView(rootView, R.id.tableRowVideocard, (deviceInfo.getVideocard() != null ? deviceInfo.getVideocard() : getResources()
.getString(R.string.unknown)));
AndroidUtil.setTextInView(rootView, R.id.tableRowMemory,
(deviceInfo.getRam() != null ? deviceInfo.getRam() + " MB" : getResources().getString(R.string.unknown)));
// load competitions for this device!
if (availableCompetitionsTask == null){
availableCompetitionsTask = new AvailableCompetitionsTask(MainActivity.getActivity(), TabFragmentBench.getInstance());
availableCompetitionsTask.execute(deviceInfo.getId());
}
} else {
MainActivity.toast("Unkown phone. Leaderboards not available.");
Log.w(TabFragmentBench.class.getSimpleName(), "No device info: " + deviceInfo);
}
}
// is there a better way?
public static TabFragmentBench getInstance() {
if (fragment == null) {
fragment = (TabFragmentBench) MainActivity.getActivity().mSectionsPagerAdapter.getItem(TabFragmentBench.POSITION);
}
return fragment;
}
@Override
public void notifyDevicePersonalRecords(final DeviceRecordsDTO records) {
if (MainActivity.getActivity() != null) {
MainActivity.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Map<RecordType, DeviceRecordDTO> hwbotPrimeRecordsPersonal = records.getRecords();
if (hwbotPrimeRecordsPersonal != null && !hwbotPrimeRecordsPersonal.isEmpty()) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Updating personal: " + hwbotPrimeRecordsPersonal);
setScore(bestPhoneMe, hwbotPrimeRecordsPersonal.get(RecordType.best_device));
setScore(bestCoreMe, hwbotPrimeRecordsPersonal.get(RecordType.best_cpu_core));
setScore(bestFamilyMe, hwbotPrimeRecordsPersonal.get(RecordType.best_cpu_family));
setScore(bestOverallMe, hwbotPrimeRecordsPersonal.get(RecordType.best_overall_soc));
MainActivity.getActivity().storePersonalRecords(records);
} else {
rootView.findViewById(R.id.myRecords).setVisibility(View.GONE);
}
}
});
}
}
@Override
public void notifyDeviceRecords(final DeviceRecordsDTO records) {
if (MainActivity.activity != null) {
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Map<RecordType, DeviceRecordDTO> hwbotPrimeRecords = records.getRecords();
if (hwbotPrimeRecords != null) {
// Log.i(TabFragmentBench.class.getSimpleName(), "Updating WR: " + hwbotPrimeRecords);
setScore(bestPhone, hwbotPrimeRecords.get(RecordType.best_device));
setScore(bestCore, hwbotPrimeRecords.get(RecordType.best_cpu_core));
setScore(bestFamily, hwbotPrimeRecords.get(RecordType.best_cpu_family));
setScore(bestOverall, hwbotPrimeRecords.get(RecordType.best_overall_soc));
}
MainActivity.getActivity().storeRecords(records);
}
});
}
}
@Override
public void notifyRecordsFailed(Status status) {
if (MainActivity.activity != null) {
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
MainActivity.toast("Failed to update records.");
}
});
}
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
// Log.i(TabFragmentBench.class.getSimpleName(), "View state restored.");
super.onViewStateRestored(savedInstanceState);
}
public String getDeviceIdentification() {
return Build.MANUFACTURER + " - " + Build.MODEL + " - " + Build.PRODUCT + " -- " + AndroidHardwareService.getInstance().getHardwareFromCpuInfo();
}
public void prepareView() {
updateDeviceInfo();
}
@Override
public void notifyAvailableCompetitions(final List<CompetitionStageDTO> stages) {
MainActivity.getActivity().runOnUiThread(
new Runnable() {
@Override
public void run() {
LinearLayout competitionBox = (LinearLayout) rootView.findViewById(R.id.competitionBox);
if (stages != null && stages.size() > 0){
competitionBox.setVisibility(View.VISIBLE);
for (final CompetitionStageDTO stage : stages) {
String label;
if (SecurityService.getInstance().isLoggedIn()){
label = rootView.getResources().getString(R.string.participate_checkbox, stage.getRound().getName());
} else {
label = rootView.getResources().getString(R.string.participate_login_checkbox, stage.getRound().getName());
}
final CheckBox button = new CheckBox(competitionBox.getContext());
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
button.setLayoutParams(params);
button.setText(label);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = ((CheckBox) v).isChecked();
if (SecurityService.getInstance().isLoggedIn()){
if (checked) {
MainActivity.bench.setStageId(stage.getId());
} else {
MainActivity.bench.setStageId(null);
}
} else {
// reset and go to account tab
((CheckBox) v).setChecked(!checked);
MainActivity.getActivity().mViewPager.setCurrentItem(TabFragmentAccount.POSITION);
}
}
});
if (StringUtils.isNotEmpty(stage.getMobileBanner())){
ImageButton banner = new ImageButton(competitionBox.getContext());
banner.setScaleType(ImageView.ScaleType.FIT_XY);
banner.setTag(stage.getMobileBanner());
new ImageLoaderTask(null).execute(banner);
banner.setOnClickListener(new View.OnClickListener() {
@Override
@TargetApi(value = 15)
public void onClick(View v) {
// button.setChecked(!button.isChecked());
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(BenchService.SERVER +"/competition/"+stage.getRound().getSafeName()));
startActivity(i);
}
});
competitionBox.addView(banner);
}
competitionBox.addView(button);
}
} else {
Log.i(TabFragmentBench.class.getName(), "hiding competition box");
competitionBox.setVisibility(View.GONE);
}
availableCompetitionsTask = null;
}
}
);
}
}