+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu.
+ getMenuInflater().inflate(R.menu.domains_options_menu, menu);
+
+ // Store `deleteMenuItem` for future use.
+ deleteMenuItem = menu.findItem(R.id.delete_domain);
+
+ // Only display `deleteMenuItem` (initially) in two-paned mode.
+ deleteMenuItem.setVisible(twoPanedMode);
+
+ // Populate the list of domains. We have to do this from `onCreateOptionsMenu()` instead of `onCreate()` because `populateDomainsListView()` needs the `deleteMenuItem` to be inflated. `-1` highlights the first domain.
+ populateDomainsListView(-1);
+
+ // Success!
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem menuItem) {
+ // Get the ID of the `MenuItem` that was selected.
+ int menuItemID = menuItem.getItemId();
+
+ switch (menuItemID) {
+ case android.R.id.home: // The home arrow is identified as `android.R.id.home`, not just `R.id.home`.
+ if (twoPanedMode) { // The device is in two-paned mode.
+ // Save the current domain settings if the domain settings fragment is displayed.
+ if (findViewById(R.id.domain_settings_scrollview) != null) {
+ saveDomainSettings();
+ }
+
+ // Go home.
+ NavUtils.navigateUpFromSameTask(this);
+ } else if (domainSettingsFragmentDisplayed) { // The device is in single-paned mode and `DomainSettingsFragment` is displayed.
+ // Save the current domain settings.
+ saveDomainSettings();
+
+ // Display `DomainsListFragment`.
+ DomainsListFragment domainsListFragment = new DomainsListFragment();
+ supportFragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
+ supportFragmentManager.executePendingTransactions();
+
+ // Populate the list of domains. `-1` highlights the first domain if in two-paned mode. It has no effect in single-paned mode.
+ populateDomainsListView(-1);
+
+ // Update `domainSettingsFragmentDisplayed`.
+ domainSettingsFragmentDisplayed = false;
+
+ // Display `addDomainFAB`.
+ addDomainFAB.setVisibility(View.VISIBLE);
+
+ // Hide `deleteMenuItem`.
+ deleteMenuItem.setVisible(false);
+ } else { // The device is in single-paned mode and `DomainsListFragment` is displayed.
+ // Go home.
+ NavUtils.navigateUpFromSameTask(this);
+ }
+ break;
+
+ case R.id.delete_domain:
+ // Store a copy of `currentDomainDatabaseId` because it could change while the `Snackbar` is displayed.
+ final int databaseIdToDelete = currentDomainDatabaseId;
+
+ // Store the deleted domain position, which is needed if `Undo` is selected in the `Snackbar`.
+ final int deletedDomainPosition = domainsListView.getCheckedItemPosition();
+
+ // Update the fragments and menu items.
+ if (twoPanedMode) { // Two-paned mode.
+ // Disable the options `MenuItems`.
+ deleteMenuItem.setEnabled(false);
+ deleteMenuItem.setIcon(R.drawable.delete_blue);
+
+ // Remove the domain settings fragment.
+ supportFragmentManager.beginTransaction().remove(supportFragmentManager.findFragmentById(R.id.domain_settings_fragment_container)).commit();
+ } else { // Single-paned mode.
+ // Display `DomainsListFragment`.
+ DomainsListFragment domainsListFragment = new DomainsListFragment();
+ supportFragmentManager.beginTransaction().replace(R.id.domains_listview_fragment_container, domainsListFragment).commit();
+ supportFragmentManager.executePendingTransactions();
+
+ // Update `domainSettingsFragmentDisplayed`.
+ domainSettingsFragmentDisplayed = false;
+
+ // Display `addDomainFAB`.
+ addDomainFAB.setVisibility(View.VISIBLE);
+
+ // Hide `deleteMenuItem`.
+ deleteMenuItem.setVisible(false);
+ }
+
+ // Get a `Cursor` that does not show the domain to be deleted.
+ Cursor domainsPendingDeleteCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomainExcept(databaseIdToDelete);
+
+ // Setup `domainsPendingDeleteCursorAdapter` with `this` context. `false` disables `autoRequery`.
+ CursorAdapter domainsPendingDeleteCursorAdapter = new CursorAdapter(this, domainsPendingDeleteCursor, false) {
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ // Inflate the individual item layout. `false` does not attach it to the root.
+ return getLayoutInflater().inflate(R.layout.domain_name_linearlayout, parent, false);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ // Set the domain name.
+ String domainNameString = cursor.getString(cursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME));
+ TextView domainNameTextView = (TextView) view.findViewById(R.id.domain_name_textview);
+ domainNameTextView.setText(domainNameString);
+ }
+ };
+
+ // Update the handle for the current `domains_listview`.
+ domainsListView = (ListView) findViewById(R.id.domains_listview);
+
+ // Update the `ListView`.
+ domainsListView.setAdapter(domainsPendingDeleteCursorAdapter);
+
+ // Display a `Snackbar`.
+ undoDeleteSnackbar = Snackbar.make(domainsListView, R.string.domain_deleted, Snackbar.LENGTH_LONG)
+ .setAction(R.string.undo, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Do nothing because everything will be handled by `onDismissed()` below.
+ }
+ })
+ .addCallback(new Snackbar.Callback() {
+ @Override
+ public void onDismissed(Snackbar snackbar, int event) {
+ switch (event) {
+ // The user pushed the `Undo` button.
+ case Snackbar.Callback.DISMISS_EVENT_ACTION:
+ // Store `databaseId` in `argumentsBundle`.
+ Bundle argumentsBundle = new Bundle();
+ argumentsBundle.putInt(DomainSettingsFragment.DATABASE_ID, databaseIdToDelete);
+
+ // Add `argumentsBundle` to `domainSettingsFragment`.
+ DomainSettingsFragment domainSettingsFragment = new DomainSettingsFragment();
+ domainSettingsFragment.setArguments(argumentsBundle);
+
+ // Display the correct fragments.
+ if (twoPanedMode) { // The device in in two-paned mode.
+ // Get a `Cursor` with the current contents of the domains database.
+ Cursor undoDeleteDomainsCursor = domainsDatabaseHelper.getDomainNameCursorOrderedByDomain();