@Override
  public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.exchange_rates_fragment_options, menu);

    final SearchView searchView =
        (SearchView) menu.findItem(R.id.exchange_rates_options_search).getActionView();
    searchView.setOnQueryTextListener(
        new OnQueryTextListener() {
          @Override
          public boolean onQueryTextChange(final String newText) {
            query = newText.trim();
            if (query.isEmpty()) query = null;

            getLoaderManager().restartLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);

            return true;
          }

          @Override
          public boolean onQueryTextSubmit(final String query) {
            searchView.clearFocus();

            return true;
          }
        });

    super.onCreateOptionsMenu(menu, inflater);
  }
  @Override
  public void onPause() {
    loaderManager.destroyLoader(ID_BALANCE_LOADER);
    loaderManager.destroyLoader(ID_BLOCKCHAIN_STATE_LOADER);

    super.onPause();
  }
  @Override
  public void onPrepareOptionsMenu(final Menu menu) {
    menu.findItem(R.id.sending_addresses_options_paste)
        .setEnabled(getAddressFromPrimaryClip() != null);

    super.onPrepareOptionsMenu(menu);
  }
  @Override
  public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);

    adapter =
        new SimpleCursorAdapter(
            activity,
            R.layout.address_book_row,
            null,
            new String[] {AddressBookProvider.KEY_LABEL, AddressBookProvider.KEY_ADDRESS},
            new int[] {R.id.address_book_row_label, R.id.address_book_row_address},
            0);
    adapter.setViewBinder(
        new ViewBinder() {
          @Override
          public boolean setViewValue(final View view, final Cursor cursor, final int columnIndex) {
            if (!AddressBookProvider.KEY_ADDRESS.equals(cursor.getColumnName(columnIndex)))
              return false;

            ((TextView) view)
                .setText(
                    WalletUtils.formatHash(
                        cursor.getString(columnIndex),
                        Constants.ADDRESS_FORMAT_GROUP_SIZE,
                        Constants.ADDRESS_FORMAT_LINE_SIZE));

            return true;
          }
        });
    setListAdapter(adapter);

    loaderManager.initLoader(0, null, this);
  }
  @Override
  public void onDestroy() {
    config.unregisterOnSharedPreferenceChangeListener(this);

    loaderManager.destroyLoader(ID_RATE_LOADER);

    super.onDestroy();
  }
  @Override
  public void onResume() {
    super.onResume();

    loaderManager.initLoader(ID_BALANCE_LOADER, null, balanceLoaderCallbacks);
    loaderManager.initLoader(ID_BLOCKCHAIN_STATE_LOADER, null, blockchainStateLoaderCallbacks);

    updateView();
  }
  @Override
  public void onAttach(final Activity activity) {
    super.onAttach(activity);

    this.activity = (AbstractWalletActivity) activity;
    final WalletApplication application = (WalletApplication) activity.getApplication();
    this.wallet = application.getWallet();
    this.clipboardManager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE);
    this.loaderManager = getLoaderManager();
  }
  @Override
  public void onAttach(final Activity activity) {
    super.onAttach(activity);

    this.activity = (AbstractWalletActivity) activity;
    this.application = (WalletApplication) activity.getApplication();
    this.config = application.getConfiguration();
    this.wallet = application.getWallet();
    this.contentUri = ExchangeRatesProvider.contentUri(activity.getPackageName(), false);
    this.loaderManager = getLoaderManager();
  }
  @Override
  public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.sending_addresses_fragment_options, menu);

    final PackageManager pm = activity.getPackageManager();
    menu.findItem(R.id.sending_addresses_options_scan)
        .setVisible(
            pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
                || pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT));

    super.onCreateOptionsMenu(menu, inflater);
  }
  @Override
  public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRetainInstance(true);
    setHasOptionsMenu(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB);

    adapter = new ExchangeRatesAdapter(activity);
    setListAdapter(adapter);

    loaderManager.initLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);

    defaultCurrency = config.getExchangeCurrencyCode();
    config.registerOnSharedPreferenceChangeListener(this);
  }
  @Override
  public void onViewCreated(final View view, final Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    getListView().setFastScrollEnabled(true);
  }
  @Override
  public void onDestroy() {
    loaderManager.destroyLoader(0);

    super.onDestroy();
  }
  @Override
  public void onPause() {
    clipboardManager.removePrimaryClipChangedListener(this);

    super.onPause();
  }
  @Override
  public void onResume() {
    super.onResume();

    clipboardManager.addPrimaryClipChangedListener(this);
  }