package kc.spark.pixels.android.ui.smartconfig; import java.util.Iterator; import kc.get.pixel.list.android.R; import kc.spark.pixels.android.app.DeviceState; import kc.spark.pixels.android.cloud.ApiFacade; import kc.spark.pixels.android.cloud.api.Device; import kc.spark.pixels.android.cloud.requestservice.SimpleSparkApiService; import kc.spark.pixels.android.smartconfig.SmartConfigService; import kc.spark.pixels.android.smartconfig.SmartConfigState; import kc.spark.pixels.android.ui.BaseFragment; import kc.spark.pixels.android.ui.corelist.CoreListActivity; import kc.spark.pixels.android.ui.util.NamingHelper; import kc.spark.pixels.android.ui.util.Ui; import kc.spark.pixels.android.util.CoreNameGenerator; import org.apache.http.HttpStatus; import org.solemnsilence.util.TLog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class NamingFragment extends BaseFragment { private static final TLog log = new TLog(NamingFragment.class); private static final String STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID = "STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID"; EditText coreNameText; Button okButton; SmartConfigFoundSomethingReceiver foundSomethingReceiver; MoreCoresClaimedReceiver moreCoresClaimedReceiver; String currentRenameAttemptHexId; @Override public int getContentViewLayoutId() { return R.layout.fragment_naming; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null && savedInstanceState.containsKey(STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID)) { currentRenameAttemptHexId = savedInstanceState.getString( STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID); } foundSomethingReceiver = new SmartConfigFoundSomethingReceiver(); moreCoresClaimedReceiver = new MoreCoresClaimedReceiver(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); coreNameText = Ui.findView(this, R.id.core_name); coreNameText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { if (id == R.id.name_core || id == EditorInfo.IME_NULL) { nameCurrentCore(); return true; } return false; } }); okButton = Ui.findView(this, R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { nameCurrentCore(); } }); if (currentRenameAttemptHexId == null) { startNaming(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(STATE_CURRENT_RENAME_ATTEMPT_DEVICE_ID, currentRenameAttemptHexId); } @Override public void onStart() { super.onStart(); broadcastMgr.registerReceiver(foundSomethingReceiver, foundSomethingReceiver.getFilter()); broadcastMgr.registerReceiver(moreCoresClaimedReceiver, moreCoresClaimedReceiver.getFilter()); setHeaderCoreCountMessage(); } @Override public void onStop() { broadcastMgr.unregisterReceiver(foundSomethingReceiver); broadcastMgr.unregisterReceiver(moreCoresClaimedReceiver); SmartConfigService.stopSmartConfig(getActivity()); super.onStop(); } private String getNextFoundId() { Iterator<String> iter = SmartConfigState.getClaimedButPossiblyUnnamedDeviceIds().iterator(); if (iter.hasNext()) { return iter.next(); } else { return null; } } private void populateName() { Device device = DeviceState.getDeviceById(currentRenameAttemptHexId); String name = null; if (device != null) { // use existing name name = device.name; } // it could still be null if the device was never named if (name == null) { name = CoreNameGenerator.generateUniqueName(DeviceState.getExistingCoreNames()); } coreNameText.setText(name); } private void startNaming() { String nextId = getNextFoundId(); if (nextId == null) { stopNaming(); } else { currentRenameAttemptHexId = nextId; api.startSignalling(currentRenameAttemptHexId); showProgress(false); setHeaderCoreCountMessage(); populateName(); } } private void setHeaderCoreCountMessage() { int count = SmartConfigState.getClaimedButPossiblyUnnamedDeviceIds().size(); Resources res = getResources(); String letsNameCoresMsg = res.getQuantityString(R.plurals.foundCoresMsg, count, count); Ui.setText(this, R.id.header_text, letsNameCoresMsg); } private void nameCurrentCore() { String name = coreNameText.getText().toString(); Device existingDevice = DeviceState.getDeviceById(currentRenameAttemptHexId); // is this the name of an existing device? if (DeviceState.getExistingCoreNames().contains(name)) { // is it the current device? if (existingDevice == null || !name.equals(existingDevice.name)) { // No, it's not, which means this name belongs to another device // for this user, so it's a dupe name -- don't allow it. new NamingHelper(getActivity(), api).showDupeNameDialog(null); return; } } api.nameCore(currentRenameAttemptHexId, name); showProgress(true); } private void stopNaming() { Intent intent = new Intent(getActivity(), CoreListActivity.class) .putExtra(CoreListActivity.ARG_SELECT_DEVICE_ID, currentRenameAttemptHexId) .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); getActivity().finish(); } private void showProgress(final boolean show) { showProgress(R.id.progress_indicator, show); okButton.setEnabled(!show); } private void namingRequestFinished(boolean previousWasSuccessful, String errorMsg) { if (SmartConfigState.getClaimedButPossiblyUnnamedDeviceIds().isEmpty()) { // we're done stopNaming(); return; } startNaming(); } class MoreCoresClaimedReceiver extends BroadcastReceiver { IntentFilter getFilter() { return new IntentFilter(ApiFacade.BROADCAST_CORE_CLAIMED); } @Override public void onReceive(Context context, Intent intent) { log.i("Received BROADCAST_CORE_CLAIMED."); setHeaderCoreCountMessage(); } } class SmartConfigFoundSomethingReceiver extends BroadcastReceiver { IntentFilter getFilter() { return new IntentFilter(ApiFacade.BROADCAST_CORE_NAMING_REQUEST_COMPLETE); } @Override public void onReceive(Context context, Intent intent) { log.i("Received BROADCAST_CORE_NAMING_REQUEST_COMPLETE."); namingRequestFinished((ApiFacade.getResultCode(intent) == HttpStatus.SC_OK), intent.getStringExtra(SimpleSparkApiService.EXTRA_ERROR_MSG)); } } }