Unblock A Number On Android Updated <Direct Link>
public boolean unblockNumber(BlockedNumber blockedNumber) { Set<String> blockedSet = sharedPreferences.getStringSet(KEY_BLOCKED_LIST, new HashSet<>()); Set<String> newBlockedSet = new HashSet<>(blockedSet); String numberToRemove = null; for (String numberJson : blockedSet) { try { JSONObject jsonObject = new JSONObject(numberJson); if (jsonObject.getString("number").equals(blockedNumber.getPhoneNumber())) { numberToRemove = numberJson; break; } } catch (JSONException e) { e.printStackTrace(); } } if (numberToRemove != null && newBlockedSet.remove(numberToRemove)) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putStringSet(KEY_BLOCKED_LIST, newBlockedSet); editor.apply(); // Also remove from system call blocking if applicable removeFromSystemBlockList(blockedNumber.getPhoneNumber()); return true; } return false; }
private class BlockedNumbersAdapter extends RecyclerView.Adapter<BlockedNumbersAdapter.ViewHolder> { private List<BlockedNumber> numbers = new ArrayList<>(); @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_blocked_number, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { BlockedNumber blockedNumber = numbers.get(position); holder.bind(blockedNumber); } @Override public int getItemCount() { return numbers.size(); } public void setData(List<BlockedNumber> numbers) { this.numbers = numbers; notifyDataSetChanged(); } class ViewHolder extends RecyclerView.ViewHolder { TextView tvNumber, tvName, tvBlockedDate; Button btnUnblock; ViewHolder(View itemView) { super(itemView); tvNumber = itemView.findViewById(R.id.tvNumber); tvName = itemView.findViewById(R.id.tvName); tvBlockedDate = itemView.findViewById(R.id.tvBlockedDate); btnUnblock = itemView.findViewById(R.id.btnUnblock); } void bind(BlockedNumber blockedNumber) { tvNumber.setText(blockedNumber.getPhoneNumber()); tvName.setText(blockedNumber.getContactName()); tvBlockedDate.setText("Blocked on: " + blockedNumber.getBlockedDate()); btnUnblock.setOnClickListener(v -> showUnblockDialog(blockedNumber)); } private void showUnblockDialog(BlockedNumber blockedNumber) { new AlertDialog.Builder(BlockedNumbersActivity.this) .setTitle("Unblock Number") .setMessage("Are you sure you want to unblock " + blockedNumber.getPhoneNumber() + "?") .setPositiveButton("Yes", (dialog, which) -> { unblockNumber(blockedNumber); }) .setNegativeButton("No", null) .show(); } private void unblockNumber(BlockedNumber blockedNumber) { boolean success = blockedNumbersManager.unblockNumber(blockedNumber); if (success) { Toast.makeText(BlockedNumbersActivity.this, "Number unblocked successfully", Toast.LENGTH_SHORT).show(); loadBlockedNumbers(); // Refresh list } else { Toast.makeText(BlockedNumbersActivity.this, "Failed to unblock number", Toast.LENGTH_SHORT).show(); } } } } } - Manager class for blocked numbers public class BlockedNumbersManager { private Context context; private SharedPreferences sharedPreferences; private static final String PREF_NAME = "blocked_numbers"; private static final String KEY_BLOCKED_LIST = "blocked_list"; unblock a number on android
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> - List item layout <?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" app:cardCornerRadius="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tvNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" android:textColor="#000000"/> <TextView android:id="@+id/tvName" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="#666666" android:layout_marginTop="4dp"/> <TextView android:id="@+id/tvBlockedDate" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="#999999" android:layout_marginTop="4dp"/> <Button android:id="@+id/btnUnblock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Unblock" android:layout_marginTop="8dp" style="?attr/materialButtonOutlinedStyle"/> </LinearLayout> </androidx.cardview.widget.CardView> 7. Optional: Add quick unblock from call log (CallLogHelper.java) public class CallLogHelper { public static void addUnblockButtonToCallLog(Context context, String phoneNumber) { // This can be integrated into your call log adapter new AlertDialog.Builder(context) .setTitle("Unblock Number") .setMessage("Do you want to unblock " + phoneNumber + "?") .setPositiveButton("Yes", (dialog, which) -> { BlockedNumbersManager manager = new BlockedNumbersManager(context); BlockedNumber blockedNumber = new BlockedNumber(); blockedNumber.setPhoneNumber(phoneNumber); blockedNumber.setContactName(getContactName(context, phoneNumber)); if (manager.unblockNumber(blockedNumber)) { Toast.makeText(context, "Number unblocked", Toast.LENGTH_SHORT).show(); } }) .setNegativeButton("No", null) .show(); } blockedSet = sharedPreferences.getStringSet(KEY_BLOCKED_LIST
public BlockedNumbersManager(Context context) { this.context = context; this.sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); } newBlockedSet = new HashSet<
private void setupRecyclerView() { recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new BlockedNumbersAdapter(); recyclerView.setAdapter(adapter); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_blocked_numbers); blockedNumbersManager = new BlockedNumbersManager(this); recyclerView = findViewById(R.id.recyclerView); setupRecyclerView(); loadBlockedNumbers(); }


