package info.blockchain.wallet.ui; import java.math.BigInteger; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sourceforge.zbar.Symbol; import com.dm.zbar.android.scanner.ZBarConstants; import com.dm.zbar.android.scanner.ZBarScannerActivity; import com.google.bitcoin.core.ECKey; import com.google.bitcoin.core.Transaction; import piuk.blockchain.android.EventListeners; import piuk.blockchain.android.MyRemoteWallet; import piuk.blockchain.android.R; import piuk.blockchain.android.WalletApplication; import piuk.blockchain.android.WalletApplication.AddAddressCallback; import piuk.blockchain.android.SuccessCallback; import piuk.blockchain.android.ui.dialogs.RequestPasswordDialog; import piuk.blockchain.android.util.WalletUtils; import android.app.Activity; import android.app.ActionBar; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.ContextMenu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.View.OnTouchListener; import android.view.View.OnCreateContextMenuListener; import android.view.MenuInflater; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.DrawerLayout; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.Fragment; //import android.util.Log; public class AddressBookActivity extends Activity { private ArrayList<String> allAddresses = null; private Map<String, String> labelMap = null; private AddressAdapter adapter = null; private List<Map<String, Object>> addressBookMapList = null; private AddressManager addressManager = null; private int curSelection = -1; WalletApplication application = null; private static int QR_GENERATION = 1; private static int EDIT_LABEL = 2; private static int SCAN_WATCH_ONLY = 3; private static int SCAN_CONTACTS_ADDRESS = 4; private static int SCAN_PRIVATE_KEY = 5; private String editLabelAddress = null; private final int color_spend_selected = 0xff808080; private final int color_spend_unselected = 0xffa0a0a0; private ImageView imgArchived; private ImageView imgActive; private ImageView imgContacts; private LinearLayout layoutArchived; private LinearLayout layoutActive; private LinearLayout layoutContacts; // // // private DrawerLayout mDrawerLayout = null; private ListView mDrawerList = null; private ActionBarDrawerToggle mDrawerToggle = null; private MyRemoteWallet remoteWallet = null; private static enum DisplayedAddresses { ContactsAddresses, ActiveAddresses, ArchivedAddresses } private DisplayedAddresses displayedAddresses = null; private ProgressDialog bip38DecryptDialog = null; private EventListeners.EventListener eventListener = new EventListeners.EventListener() { @Override public String getDescription() { return "AddressBookActivity Listener"; } @Override public void onCoinsSent(final Transaction tx, final long result) { setAdapterContent(); }; @Override public void onCoinsReceived(final Transaction tx, final long result) { setAdapterContent(); }; @Override public void onTransactionsChanged() { setAdapterContent(); }; @Override public void onWalletDidChange() { setAdapterContent(); } @Override public void onCurrencyChanged() { setAdapterContent(); }; }; public void setAdapterContent() { if (displayedAddresses == DisplayedAddresses.ActiveAddresses) { initActiveList(); } else if (displayedAddresses == DisplayedAddresses.ArchivedAddresses) { initArchivedList(); } else if (displayedAddresses == DisplayedAddresses.ContactsAddresses) { initContactsList(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addressbook); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ActionBar actionBar = getActionBar(); actionBar.hide(); actionBar.setDisplayOptions(actionBar.getDisplayOptions() ^ ActionBar.DISPLAY_SHOW_TITLE); actionBar.setLogo(R.drawable.masthead); // actionBar.setHomeButtonEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FF1B8AC7"))); actionBar.show(); // // // mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.drawer_list); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { invalidateOptionsMenu(); } public void onDrawerOpened(View view) { invalidateOptionsMenu(); } }; // hide settings menu // invalidateOptionsMenu(); mDrawerLayout.setDrawerListener(mDrawerToggle); ArrayAdapter<String> hAdapter = new ArrayAdapter<String>(getBaseContext(), R.layout.drawer_list_item, getResources().getStringArray(R.array.menus_addressBook)); mDrawerList.setAdapter(hAdapter); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); mDrawerList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { switch (position) { case 0: { if (remoteWallet.isDoubleEncrypted() && remoteWallet.temporySecondPassword == null) { /* RequestPasswordDialog.show(getFragmentManager(), new SuccessCallback() { public void onSuccess() { doAddAddress(); } public void onFail() { Toast.makeText(application, R.string.send_no_password_error, Toast.LENGTH_LONG).show(); } }, RequestPasswordDialog.PasswordTypeSecond); */ } else { doAddAddress(); } } break; case 1: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_WATCH_ONLY); } break; case 2: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_CONTACTS_ADDRESS); } break; case 3: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_PRIVATE_KEY); } break; default: break; } mDrawerLayout.closeDrawer(mDrawerList); invalidateOptionsMenu(); } }); boolean gotoContactsAddresses = false; Bundle extras = getIntent().getExtras(); if(extras != null) { if(extras.getBoolean("SENDING") == true) { gotoContactsAddresses = true; } } // // // remoteWallet = WalletUtil.getInstance(this).getRemoteWallet(); String[] activeAddresses = remoteWallet.getActiveAddresses(); allAddresses = new ArrayList<String>(); for(int i = 0; i < activeAddresses.length; i++) { allAddresses.add("A" + activeAddresses[i]); } displayedAddresses = DisplayedAddresses.ActiveAddresses; labelMap = remoteWallet.getLabelMap(); // // // ListView listView = (ListView)findViewById(R.id.listview); listView.setLongClickable(true); adapter = new AddressAdapter(); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { // Toast.makeText(AddressBookActivity.this, allAddresses.get(position), Toast.LENGTH_LONG).show(); curSelection = position; } }); listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; // Toast.makeText(AddressBookActivity.this, "" + info.position, Toast.LENGTH_LONG).show(); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.address_list, menu); curSelection = info.position; String type = allAddresses.get(info.position).substring(0, 1); if(type.equals("A")) { menu.removeItem(R.id.unarchive_address); menu.removeItem(R.id.remove_address); } else if(type.equals("S")) { menu.removeItem(R.id.archive_address); menu.removeItem(R.id.unarchive_address); menu.removeItem(R.id.default_address); } else { menu.removeItem(R.id.edit_label); menu.removeItem(R.id.archive_address); menu.removeItem(R.id.remove_address); menu.removeItem(R.id.qr_code); menu.removeItem(R.id.default_address); } } }); imgArchived = ((ImageView)findViewById(R.id.archived)); imgActive = ((ImageView)findViewById(R.id.active)); imgContacts = ((ImageView)findViewById(R.id.contacts)); layoutArchived = ((LinearLayout)findViewById(R.id.archived_bg)); layoutActive = ((LinearLayout)findViewById(R.id.active_bg)); layoutContacts = ((LinearLayout)findViewById(R.id.contacts_bg)); imgArchived.setBackgroundColor(color_spend_unselected); imgActive.setBackgroundColor(color_spend_selected); imgContacts.setBackgroundColor(color_spend_unselected); layoutArchived.setBackgroundColor(color_spend_unselected); layoutActive.setBackgroundColor(color_spend_selected); layoutContacts.setBackgroundColor(color_spend_unselected); layoutArchived.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { AddressBookActivity.this.imgArchived.setBackgroundColor(color_spend_selected); AddressBookActivity.this.imgActive.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.imgContacts.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutArchived.setBackgroundColor(color_spend_selected); AddressBookActivity.this.layoutActive.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutContacts.setBackgroundColor(color_spend_unselected); initArchivedList(); return false; } }); layoutActive.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { AddressBookActivity.this.imgArchived.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.imgActive.setBackgroundColor(color_spend_selected); AddressBookActivity.this.imgContacts.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutArchived.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutActive.setBackgroundColor(color_spend_selected); AddressBookActivity.this.layoutContacts.setBackgroundColor(color_spend_unselected); initActiveList(); return false; } }); layoutContacts.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { AddressBookActivity.this.imgArchived.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.imgActive.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.imgContacts.setBackgroundColor(color_spend_selected); AddressBookActivity.this.layoutArchived.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutActive.setBackgroundColor(color_spend_unselected); AddressBookActivity.this.layoutContacts.setBackgroundColor(color_spend_selected); initContactsList(); return false; } }); application = WalletUtil.getInstance(this).getWalletApplication(); addressManager = new AddressManager(remoteWallet, application, this); EventListeners.addEventListener(eventListener); application.checkIfWalletHasUpdatedAndFetchTransactions(application.getRemoteWallet().getTemporyPassword()); if(gotoContactsAddresses) { gotoContactsAddresses(); } } public void gotoContactsAddresses() { imgArchived.setBackgroundColor(color_spend_unselected); imgActive.setBackgroundColor(color_spend_unselected); imgContacts.setBackgroundColor(color_spend_selected); layoutArchived.setBackgroundColor(color_spend_unselected); layoutActive.setBackgroundColor(color_spend_unselected); layoutContacts.setBackgroundColor(color_spend_selected); initContactsList(); } public void goToActiveAddresses() { imgArchived.setBackgroundColor(color_spend_unselected); imgActive.setBackgroundColor(color_spend_selected); imgContacts.setBackgroundColor(color_spend_unselected); layoutArchived.setBackgroundColor(color_spend_unselected); layoutActive.setBackgroundColor(color_spend_selected); layoutContacts.setBackgroundColor(color_spend_unselected); initActiveList(); } /* @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.addressbook, menu); return true; } */ @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } else { switch (item.getItemId()) { case R.id.new_address: if (remoteWallet.isDoubleEncrypted() && remoteWallet.temporySecondPassword == null) { /* RequestPasswordDialog.show(getFragmentManager(), new SuccessCallback() { public void onSuccess() { doAddAddress(); } public void onFail() { Toast.makeText(application, R.string.send_no_password_error, Toast.LENGTH_LONG).show(); } }, RequestPasswordDialog.PasswordTypeSecond); */ } else { doAddAddress(); } return true; case R.id.scan_watch_only: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_WATCH_ONLY); } return true; case R.id.scan_contacts_address: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_CONTACTS_ADDRESS); } return true; case R.id.scan_private_key: { Intent intent = new Intent(AddressBookActivity.this, ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[] { Symbol.QRCODE } ); startActivityForResult(intent, SCAN_PRIVATE_KEY); } return true; default: return super.onOptionsItemSelected(item); } } } public void handleScanPrivateKey(final String data) { try { final String format = WalletUtils.detectPrivateKeyFormat(data); // System.out.println("Scanned Private Key Format " + format); if (format.equals("bip38")) { AlertDialog.Builder builder = new AlertDialog.Builder(AddressBookActivity.this); builder.setMessage(R.string.enter_bip38_passphrase) .setCancelable(false); final AlertDialog alert = builder.create(); alert.setTitle(R.string.passphrase_required); final EditText input = new EditText(AddressBookActivity.this); input.setHint(R.string.password_hint); alert.setView(input); alert.setButton(AlertDialog.BUTTON_POSITIVE, getString(R.string.enter), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); final String password = input.getText().toString(); bip38DecryptDialog = new ProgressDialog(AddressBookActivity.this); bip38DecryptDialog.setTitle(R.string.decrypting); bip38DecryptDialog.setMessage("Please wait"); bip38DecryptDialog.setCancelable(false); bip38DecryptDialog.show(); new Thread() { @Override public void run() { try { final ECKey key = WalletUtils.parsePrivateKey(format, data, password); application.getHandler().post(new Runnable() { @Override public void run() { try { addressManager.handleScanPrivateKeyPair(key, new SuccessCallback() { @Override public void onSuccess() { if (bip38DecryptDialog != null) { bip38DecryptDialog.dismiss(); } } @Override public void onFail() { if (bip38DecryptDialog != null) { bip38DecryptDialog.dismiss(); } handleScanPrivateKey(data); } }); } catch (Exception e) { Toast.makeText(AddressBookActivity.this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); if (bip38DecryptDialog != null) { bip38DecryptDialog.dismiss();; } handleScanPrivateKey(data); } } }); } catch (final Exception e) { application.getHandler().post(new Runnable() { @Override public void run() { Toast.makeText(AddressBookActivity.this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); if (bip38DecryptDialog != null) { bip38DecryptDialog.dismiss();; } handleScanPrivateKey(data); } }); } } }.start(); }}); alert.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); }}); alert.show(); } else { try { addressManager.handleScanPrivateKeyPair(WalletUtils.parsePrivateKey(format, data, null), null); } catch (Exception e) { Toast.makeText(AddressBookActivity.this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); AddressBookActivity.this.handleScanPrivateKey(data); } } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == Activity.RESULT_OK && requestCode == SCAN_WATCH_ONLY) { String scanData = data.getStringExtra(ZBarConstants.SCAN_RESULT); try { addressManager.handleAddWatchOnly(scanData); } catch (Exception e) { e.printStackTrace(); } } else if(resultCode == Activity.RESULT_OK && requestCode == SCAN_CONTACTS_ADDRESS) { String scanData = data.getStringExtra(ZBarConstants.SCAN_RESULT); if (addressManager.canAddAddressBookEntry(scanData, "")) { addressManager.handleAddAddressBookEntry(scanData, "", new SuccessCallback() { @Override public void onSuccess() { Toast.makeText(AddressBookActivity.this, R.string.success_contact_added, Toast.LENGTH_LONG).show(); gotoContactsAddresses(); } @Override public void onFail() { Toast.makeText(AddressBookActivity.this, R.string.wallet_sync_error, Toast.LENGTH_LONG).show(); } }); } else { Toast.makeText(AddressBookActivity.this, R.string.address_already_exist, Toast.LENGTH_LONG).show(); } } else if(resultCode == Activity.RESULT_OK && requestCode == SCAN_PRIVATE_KEY) { String scanData = data.getStringExtra(ZBarConstants.SCAN_RESULT); try { handleScanPrivateKey(scanData); } catch (Exception e) { e.printStackTrace(); } } else if(resultCode == Activity.RESULT_OK && requestCode == EDIT_LABEL) { if(data != null && data.getAction() != null) { String label = data.getAction(); Toast.makeText(AddressBookActivity.this, label, Toast.LENGTH_LONG).show(); addressManager.setAddressLabel(editLabelAddress, label, new Runnable() { public void run() { Toast.makeText(AddressBookActivity.this, R.string.toast_error_syncing_wallet, Toast.LENGTH_LONG).show(); } }, new Runnable() { public void run() { Toast.makeText(AddressBookActivity.this, R.string.error_setting_label, Toast.LENGTH_LONG).show(); } }, new Runnable() { public void run() { Toast.makeText(AddressBookActivity.this, R.string.toast_error_syncing_wallet, Toast.LENGTH_LONG).show(); } }); } } else { ; } } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onDestroy() { super.onDestroy(); EventListeners.removeEventListener(eventListener); } /* @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; Toast.makeText(AddressBookActivity.this, "" + curSelection, Toast.LENGTH_LONG).show(); menu.removeItem(R.id.edit_label); } */ @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo(); String address = allAddresses.get(menuInfo.position).substring(1); switch (item.getItemId()) { case R.id.edit_label: // Toast.makeText(AddressBookActivity.this, "edit label", Toast.LENGTH_LONG).show(); Intent intent = new Intent(AddressBookActivity.this, info.blockchain.wallet.ui.EditSetting.class); intent.putExtra("prompt", "Edit label"); intent.putExtra("existing", address); intent.putExtra("value", labelMap.get(address)); editLabelAddress = address; startActivityForResult(intent, EDIT_LABEL); return true; case R.id.archive_address: addressManager.archiveAddress(address); return true; case R.id.unarchive_address: addressManager.unArchiveAddress(address); return true; case R.id.remove_address: addressManager.deleteAddressBook(address); return true; case R.id.qr_code: // Toast.makeText(AddressBookActivity.this, "qr code address", Toast.LENGTH_LONG).show(); doQRActivity(); return true; case R.id.default_address: addressManager.setDefaultAddress(address); return true; default: return super.onContextItemSelected(item); } } private void initArchivedList() { displayedAddresses = DisplayedAddresses.ArchivedAddresses; MyRemoteWallet remoteWallet = WalletUtil.getInstance(this).getRemoteWallet(); String[] archivedAddresses = remoteWallet.getArchivedAddresses(); allAddresses = new ArrayList<String>(); for(int i = 0; i < archivedAddresses.length; i++) { allAddresses.add("R" + archivedAddresses[i]); } labelMap = remoteWallet.getLabelMap(); adapter.notifyDataSetChanged(); } private void initActiveList() { displayedAddresses = DisplayedAddresses.ActiveAddresses; MyRemoteWallet remoteWallet = WalletUtil.getInstance(this).getRemoteWallet(); String[] activeAddresses = remoteWallet.getActiveAddresses(); allAddresses = new ArrayList<String>(); for(int i = 0; i < activeAddresses.length; i++) { allAddresses.add("A" + activeAddresses[i]); } labelMap = remoteWallet.getLabelMap(); adapter.notifyDataSetChanged(); } private void initContactsList() { displayedAddresses = DisplayedAddresses.ContactsAddresses; MyRemoteWallet remoteWallet = WalletUtil.getInstance(this).getRemoteWallet(); addressBookMapList = remoteWallet.getAddressBookMap(); allAddresses = new ArrayList<String>(); if(addressBookMapList != null) { for (Iterator<Map<String, Object>> iti = addressBookMapList.iterator(); iti.hasNext();) { Map<String, Object> addressBookMap = iti.next(); String address = (String)addressBookMap.get("addr"); allAddresses.add("S" + address); } } labelMap = remoteWallet.getLabelMap(); adapter.notifyDataSetChanged(); } private class AddressAdapter extends BaseAdapter { private LayoutInflater inflater = null; AddressAdapter() { inflater = (LayoutInflater)AddressBookActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return allAddresses.size(); } @Override public String getItem(int position) { return ""; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { view = inflater.inflate(R.layout.address_list, parent, false); } else { view = convertView; } String type = allAddresses.get(position).substring(0, 1); final String addr = allAddresses.get(position).substring(1); String label = labelMap.get(addr); if (label == null) { label = "Unlabeled"; } ((TextView)view.findViewById(R.id.txt1)).setText(label); ((TextView)view.findViewById(R.id.txt2)).setText(addr); if (displayedAddresses == DisplayedAddresses.ActiveAddresses || displayedAddresses == DisplayedAddresses.ArchivedAddresses) { String amount = "0.000"; BigInteger balance = addressManager.getBalance(addr); if (balance != null) { amount = BlockchainUtil.formatBitcoin(balance) + " BTC"; ((TextView)view.findViewById(R.id.txt3)).setText(amount); } if (addressManager.isWatchOnly(addr)) { ((TextView)view.findViewById(R.id.txt4)).setText("Watch only"); } else { ((TextView)view.findViewById(R.id.txt4)).setText(""); } } else { ((TextView)view.findViewById(R.id.txt3)).setText(""); ((TextView)view.findViewById(R.id.txt4)).setText(""); } return view; } } private void doQRActivity() { android.content.ClipboardManager clipboard = (android.content.ClipboardManager)this.getSystemService(android.content.Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("Address", allAddresses.get(curSelection).substring(1)); clipboard.setPrimaryClip(clip); Toast.makeText(this, "Address copied to clipboard", Toast.LENGTH_LONG).show(); Intent intent; intent = new Intent(this, QRActivity.class); intent.putExtra("BTC_ADDRESS", allAddresses.get(curSelection).substring(1)); startActivityForResult(intent, QR_GENERATION); } private void doAddAddress() { addressManager.newAddress(new AddAddressCallback() { public void onSavedAddress(String address) { Toast.makeText(AddressBookActivity.this, R.string.toast_new_address_generated, Toast.LENGTH_LONG).show(); goToActiveAddresses(); } public void onError(String reason) { Toast.makeText(AddressBookActivity.this, reason, Toast.LENGTH_LONG).show(); } }); } }