summaryrefslogtreecommitdiff
path: root/src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java')
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java177
1 files changed, 143 insertions, 34 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java b/src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java
index 23a794e73..1b8ac8584 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastListActivity.java
@@ -19,8 +19,6 @@ package com.android.cellbroadcastreceiver;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.annotation.Nullable;
-import android.app.ActionBar;
-import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
@@ -39,19 +37,22 @@ import android.os.Bundle;
import android.os.UserManager;
import android.provider.Telephony;
import android.telephony.SmsCbMessage;
+import android.util.ArrayMap;
import android.util.Log;
+import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
+import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity;
import java.util.ArrayList;
@@ -59,7 +60,7 @@ import java.util.ArrayList;
* This activity provides a list view of received cell broadcasts. Most of the work is handled
* in the inner CursorLoaderListFragment class.
*/
-public class CellBroadcastListActivity extends Activity {
+public class CellBroadcastListActivity extends CollapsingToolbarBaseActivity {
@VisibleForTesting
public CursorLoaderListFragment mListFragment;
@@ -68,20 +69,16 @@ public class CellBroadcastListActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- // android.R.id.home will be triggered in onOptionsItemSelected()
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
-
setTitle(getString(R.string.cb_list_activity_title));
FragmentManager fm = getFragmentManager();
// Create the list fragment and add it as our sole content.
- if (fm.findFragmentById(android.R.id.content) == null) {
+ if (fm.findFragmentById(com.android.settingslib.collapsingtoolbar.R.id.content_frame)
+ == null) {
mListFragment = new CursorLoaderListFragment();
- fm.beginTransaction().add(android.R.id.content, mListFragment).commit();
+ fm.beginTransaction().add(com.android.settingslib.collapsingtoolbar.R.id.content_frame,
+ mListFragment).commit();
}
}
@@ -177,12 +174,16 @@ public class CellBroadcastListActivity extends Activity {
private int mCurrentLoaderId = 0;
+ private MenuItem mInformationMenuItem;
+ private ArrayMap<Integer, Long> mSelectedMessages;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
+ mSelectedMessages = new ArrayMap<Integer, Long>();
}
@Override
@@ -197,12 +198,73 @@ public class CellBroadcastListActivity extends Activity {
// Set context menu for long-press.
ListView listView = getListView();
- listView.setOnCreateContextMenuListener(mOnCreateContextMenuListener);
// Create a cursor adapter to display the loaded data.
- mAdapter = new CellBroadcastCursorAdapter(getActivity());
+ mAdapter = new CellBroadcastCursorAdapter(getActivity(), mSelectedMessages);
setListAdapter(mAdapter);
+ listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
+ listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ mode.getMenuInflater().inflate(R.menu.cell_broadcast_list_action_menu, menu);
+ mInformationMenuItem = menu.findItem(R.id.action_detail_info);
+ CellBroadcastCursorAdapter.setIsActionMode(true);
+ mAdapter.notifyDataSetChanged();
+ updateActionIconsVisibility();
+ return true;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ CellBroadcastCursorAdapter.setIsActionMode(false);
+ clearSelectedMessages();
+ mAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ if (item.getItemId() == R.id.action_detail_info) {
+ Cursor cursor = getSelectedItemSingle();
+ if (cursor != null) {
+ showBroadcastDetails(CellBroadcastCursorAdapter.createFromCursor(
+ getContext(), cursor), getLocationCheckTime(cursor),
+ wasMessageDisplayed(cursor), getGeometryString(cursor));
+ } else {
+ Log.e(TAG, "Multiple items selected with action_detail_info");
+ }
+ mode.finish();
+ return true;
+ } else if (item.getItemId() == R.id.action_delete) {
+ long[] selectedRowId = getSelectedItemsRowId();
+ confirmDeleteThread(selectedRowId);
+ mode.finish();
+ return true;
+ } else {
+ Log.e(TAG, "onActionItemClicked: unsupported action return false");
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public void onItemCheckedStateChanged(
+ ActionMode mode, int position, long id, boolean checked) {
+ int checkedCount = listView.getCheckedItemCount();
+ Cursor cursor = mAdapter.getCursor();
+ long rowId = cursor.getLong(cursor.getColumnIndexOrThrow(
+ Telephony.CellBroadcasts._ID));
+
+ toggleSelectedItem(position, rowId);
+ mode.setTitle(String.valueOf(checkedCount));
+ mAdapter.notifyDataSetChanged();
+ }
+ });
+
mCurrentLoaderId = LOADER_NORMAL_HISTORY;
if (savedInstanceState != null && savedInstanceState.containsKey(KEY_LOADER_ID)) {
mCurrentLoaderId = savedInstanceState.getInt(KEY_LOADER_ID);
@@ -327,20 +389,60 @@ public class CellBroadcastListActivity extends Activity {
.show();
}
- private final OnCreateContextMenuListener mOnCreateContextMenuListener =
- (menu, v, menuInfo) -> {
- menu.setHeaderTitle(R.string.message_options);
- menu.add(0, MENU_VIEW_DETAILS, 0, R.string.menu_view_details);
- if (mCurrentLoaderId == LOADER_NORMAL_HISTORY) {
- menu.add(0, MENU_DELETE, 0, R.string.menu_delete);
- }
- };
+ private void updateActionIconsVisibility() {
+ if (mInformationMenuItem != null) {
+ if (mSelectedMessages.size() == 1) {
+ mInformationMenuItem.setVisible(true);
+ } else {
+ mInformationMenuItem.setVisible(false);
+ }
+ }
+ }
+
+ private Cursor getSelectedItemSingle() {
+ if (mSelectedMessages.size() == 1) {
+ Cursor cursor = (Cursor) mAdapter.getItem(mSelectedMessages.keyAt(0));
+ return cursor;
+ }
+ return null;
+ }
+
+ private long[] getSelectedItemsRowId() {
+ Long[] arr = mSelectedMessages.values().toArray(new Long[mSelectedMessages.size()]);
+ long[] selectedRowId = new long[arr.length];
+ for (int i = 0; i < arr.length; i++) {
+ selectedRowId[i] = arr[i].longValue();
+ }
+ return selectedRowId;
+ }
+
+ /**
+ * Record the position and the row ID of the selected items.
+ */
+ public void toggleSelectedItem(int position, long rowId) {
+ if (mSelectedMessages.containsKey(position)) {
+ mSelectedMessages.remove(position);
+ } else {
+ mSelectedMessages.put(position, rowId);
+ }
+ updateActionIconsVisibility();
+ }
+
+ /**
+ * Clear the position and the row ID of the selected items in the ArrayMap.
+ */
+ public void clearSelectedMessages() {
+ mSelectedMessages.clear();
+ }
private void updateNoAlertTextVisibility() {
TextView noAlertsTextView = getActivity().findViewById(R.id.empty);
if (noAlertsTextView != null) {
noAlertsTextView.setVisibility(!hasAlertsInHistory()
? View.VISIBLE : View.INVISIBLE);
+ if (!hasAlertsInHistory()) {
+ getListView().setContentDescription(getString(R.string.no_cell_broadcasts));
+ }
}
}
@@ -396,8 +498,8 @@ public class CellBroadcastListActivity extends Activity {
if (cursor != null && cursor.getPosition() >= 0) {
switch (item.getItemId()) {
case MENU_DELETE:
- confirmDeleteThread(cursor.getLong(cursor.getColumnIndexOrThrow(
- Telephony.CellBroadcasts._ID)));
+ long[] selectedRowId = getSelectedItemsRowId();
+ confirmDeleteThread(selectedRowId);
break;
case MENU_VIEW_DETAILS:
@@ -417,7 +519,8 @@ public class CellBroadcastListActivity extends Activity {
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case MENU_DELETE_ALL:
- confirmDeleteThread(-1);
+ long[] deleteAll = {-1};
+ confirmDeleteThread(deleteAll);
break;
case MENU_SHOW_ALL_MESSAGES:
@@ -441,12 +544,13 @@ public class CellBroadcastListActivity extends Activity {
/**
* Start the process of putting up a dialog to confirm deleting a broadcast.
- * @param rowId the row ID of the broadcast to delete, or -1 to delete all broadcasts
+ * @param rowId array of the row ID that the broadcast to delete,
+ * or rowId[0] = -1 to delete all broadcasts
*/
- public void confirmDeleteThread(long rowId) {
+ public void confirmDeleteThread(long[] rowId) {
DeleteDialogFragment dialog = new DeleteDialogFragment();
Bundle dialogArgs = new Bundle();
- dialogArgs.putLong(DeleteDialogFragment.ROW_ID, rowId);
+ dialogArgs.putLongArray(DeleteDialogFragment.ROW_ID, rowId);
dialog.setArguments(dialogArgs);
dialog.show(getFragmentManager(), KEY_DELETE_DIALOG);
}
@@ -460,8 +564,8 @@ public class CellBroadcastListActivity extends Activity {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
setRetainInstance(true);
- long rowId = getArguments().getLong(ROW_ID);
- boolean deleteAll = rowId == -1;
+ long[] rowId = getArguments().getLongArray(ROW_ID);
+ boolean deleteAll = rowId[0] == -1;
DeleteThreadListener listener = new DeleteThreadListener(getActivity(), rowId);
AlertDialog.Builder builder = new AlertDialog.Builder(
DeleteDialogFragment.this.getActivity());
@@ -485,10 +589,10 @@ public class CellBroadcastListActivity extends Activity {
}
public static class DeleteThreadListener implements OnClickListener {
- private final long mRowId;
+ private final long[] mRowId;
private final Context mContext;
- public DeleteThreadListener(Context context, long rowId) {
+ public DeleteThreadListener(Context context, long[] rowId) {
mContext = context;
mRowId = rowId;
}
@@ -499,8 +603,13 @@ public class CellBroadcastListActivity extends Activity {
new CellBroadcastContentProvider.AsyncCellBroadcastTask(
mContext.getContentResolver()).execute(
(CellBroadcastContentProvider.CellBroadcastOperation) provider -> {
- if (mRowId != -1) {
- return provider.deleteBroadcast(mRowId);
+ if (mRowId[0] != -1) {
+ for (int i = 0; i < mRowId.length; i++) {
+ if (!provider.deleteBroadcast(mRowId[i])) {
+ Log.e(TAG, "failed to delete at row " + mRowId[i]);
+ }
+ }
+ return true;
} else {
return provider.deleteAllBroadcasts();
}