Nagram/TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsers.java
DrKLO a21494ade6 Update to 1.3.26
Applied patch from https://github.com/DrKLO/Telegram/pull/99 . Thanks.
Added German localization. Thanks to all from
https://github.com/DrKLO/Telegram/pull/129
Experimental audio (will not go to market yet, we will switch to opus
codec)
Improved text drawing perfomance (now Telegram can draw even «War and
Peace» in one message)
Ability to send multiple photos and documents from external apps
Contacts fixes
Memory usage optimizations in network code (receiving data)
Partly switched to native ByteBuffers (decoding received data)
Added support of Telegram API Layer 12
Bug fixes
2014-03-01 02:28:25 +04:00

421 lines
16 KiB
Java

/*
* This is the source code of Telegram for Android v. 1.3.2.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013.
*/
package org.telegram.ui;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.telegram.PhoneFormat.PhoneFormat;
import org.telegram.messenger.TLObject;
import org.telegram.messenger.TLRPC;
import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.RPCRequest;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Cells.ChatOrUserCell;
import org.telegram.ui.Views.BaseFragment;
import org.telegram.ui.Views.OnSwipeTouchListener;
import java.util.ArrayList;
import java.util.HashMap;
public class SettingsBlockedUsers extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ContactsActivity.ContactsActivityDelegate {
private ListView listView;
private ListAdapter listViewAdapter;
private boolean loading;
private View progressView;
private View emptyView;
private ArrayList<TLRPC.TL_contactBlocked> blockedContacts = new ArrayList<TLRPC.TL_contactBlocked>();
private HashMap<Integer, TLRPC.TL_contactBlocked> blockedContactsDict = new HashMap<Integer, TLRPC.TL_contactBlocked>();
private int selectedUserId;
@Override
public boolean onFragmentCreate() {
super.onFragmentCreate();
NotificationCenter.Instance.addObserver(this, MessagesController.updateInterfaces);
loadBlockedContacts(0, 200);
return true;
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
NotificationCenter.Instance.removeObserver(this, MessagesController.updateInterfaces);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (fragmentView == null) {
fragmentView = inflater.inflate(R.layout.settings_blocked_users_layout, container, false);
listViewAdapter = new ListAdapter(parentActivity);
listView = (ListView)fragmentView.findViewById(R.id.listView);
progressView = fragmentView.findViewById(R.id.progressLayout);
emptyView = fragmentView.findViewById(R.id.searchEmptyView);
if (loading) {
progressView.setVisibility(View.VISIBLE);
emptyView.setVisibility(View.GONE);
listView.setEmptyView(null);
} else {
progressView.setVisibility(View.GONE);
listView.setEmptyView(emptyView);
}
listView.setAdapter(listViewAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (i < blockedContacts.size()) {
UserProfileActivity fragment = new UserProfileActivity();
Bundle args = new Bundle();
args.putInt("user_id", blockedContacts.get(i).user_id);
fragment.setArguments(args);
((ApplicationActivity)parentActivity).presentFragment(fragment, "user_" + blockedContacts.get(i).user_id, false);
}
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
if (i >= blockedContacts.size()) {
return true;
}
selectedUserId = blockedContacts.get(i).user_id;
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
CharSequence[] items = new CharSequence[] {getStringEntry(R.string.Unblock)};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
TLRPC.TL_contacts_unblock req = new TLRPC.TL_contacts_unblock();
TLRPC.User user = MessagesController.Instance.users.get(selectedUserId);
if (user == null) {
return;
}
req.id = MessagesController.getInputUser(user);
TLRPC.TL_contactBlocked blocked = blockedContactsDict.get(selectedUserId);
blockedContactsDict.remove(selectedUserId);
blockedContacts.remove(blocked);
listViewAdapter.notifyDataSetChanged();
ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
}
}, null, true, RPCRequest.RPCRequestClassGeneric);
}
}
});
builder.show().setCanceledOnTouchOutside(true);
return true;
}
});
listView.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeRight() {
finishFragment(true);
}
});
emptyView.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeRight() {
finishFragment(true);
}
});
} else {
ViewGroup parent = (ViewGroup)fragmentView.getParent();
if (parent != null) {
parent.removeView(fragmentView);
}
}
return fragmentView;
}
private void loadBlockedContacts(int offset, int count) {
if (loading) {
return;
}
loading = true;
TLRPC.TL_contacts_getBlocked req = new TLRPC.TL_contacts_getBlocked();
req.offset = offset;
req.limit = count;
long requestId = ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error != null) {
Utilities.RunOnUIThread(new Runnable() {
@Override
public void run() {
loading = false;
if (progressView != null) {
progressView.setVisibility(View.GONE);
}
if (listView != null) {
if (listView.getEmptyView() == null) {
listView.setEmptyView(emptyView);
}
}
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
}
});
}
final TLRPC.contacts_Blocked res = (TLRPC.contacts_Blocked)response;
Utilities.RunOnUIThread(new Runnable() {
@Override
public void run() {
loading = false;
for (TLRPC.User user : res.users) {
MessagesController.Instance.users.put(user.id, user);
}
for (TLRPC.TL_contactBlocked blocked : res.blocked) {
if (!blockedContactsDict.containsKey(blocked.user_id)) {
blockedContacts.add(blocked);
blockedContactsDict.put(blocked.user_id, blocked);
}
}
if (progressView != null) {
progressView.setVisibility(View.GONE);
}
if (listView != null) {
if (listView.getEmptyView() == null) {
listView.setEmptyView(emptyView);
}
}
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
}
});
}
}, null, true, RPCRequest.RPCRequestClassGeneric);
ConnectionsManager.Instance.bindRequestToGuid(requestId, classGuid);
}
@Override
public void didReceivedNotification(int id, Object... args) {
if (id == MessagesController.updateInterfaces) {
int mask = (Integer)args[0];
if ((mask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (mask & MessagesController.UPDATE_MASK_NAME) != 0) {
updateVisibleRows(mask);
}
}
}
private void updateVisibleRows(int mask) {
if (listView == null) {
return;
}
int count = listView.getChildCount();
for (int a = 0; a < count; a++) {
View child = listView.getChildAt(a);
if (child instanceof ChatOrUserCell) {
((ChatOrUserCell) child).update(mask);
}
}
}
@Override
public void applySelfActionBar() {
if (parentActivity == null) {
return;
}
ActionBar actionBar = parentActivity.getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowCustomEnabled(false);
actionBar.setSubtitle(null);
actionBar.setCustomView(null);
actionBar.setTitle(getStringEntry(R.string.BlockedUsers));
TextView title = (TextView)parentActivity.findViewById(R.id.action_bar_title);
if (title == null) {
final int subtitleId = parentActivity.getResources().getIdentifier("action_bar_title", "id", "android");
title = (TextView)parentActivity.findViewById(subtitleId);
}
if (title != null) {
title.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
title.setCompoundDrawablePadding(0);
}
((ApplicationActivity)parentActivity).fixBackButton();
}
@Override
public void onResume() {
super.onResume();
if (isFinish) {
return;
}
if (getActivity() == null) {
return;
}
if (!firstStart && listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
firstStart = false;
((ApplicationActivity)parentActivity).showActionBar();
((ApplicationActivity)parentActivity).updateActionBar();
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.settings_block_users_bar_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case android.R.id.home:
finishFragment();
break;
case R.id.block_user:
ContactsActivity fragment = new ContactsActivity();
fragment.animationType = 1;
Bundle bundle = new Bundle();
bundle.putBoolean("onlyUsers", true);
bundle.putBoolean("destroyAfterSelect", true);
bundle.putBoolean("usersAsSections", true);
bundle.putBoolean("returnAsResult", true);
fragment.delegate = this;
fragment.setArguments(bundle);
((ApplicationActivity)parentActivity).presentFragment(fragment, "contacts_block", false);
break;
}
return true;
}
@Override
public void didSelectContact(TLRPC.User user) {
if (user == null || blockedContactsDict.containsKey(user.id)) {
return;
}
TLRPC.TL_contacts_block req = new TLRPC.TL_contacts_block();
req.id = MessagesController.getInputUser(user);
TLRPC.TL_contactBlocked blocked = new TLRPC.TL_contactBlocked();
blocked.user_id = user.id;
blocked.date = (int)(System.currentTimeMillis() / 1000);
blockedContactsDict.put(blocked.user_id, blocked);
blockedContacts.add(blocked);
listViewAdapter.notifyDataSetChanged();
ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
}
}, null, true, RPCRequest.RPCRequestClassGeneric);
}
private class ListAdapter extends BaseAdapter {
private Context mContext;
public ListAdapter(Context context) {
mContext = context;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int i) {
return i != blockedContacts.size();
}
@Override
public int getCount() {
if (blockedContacts.isEmpty()) {
return 0;
}
return blockedContacts.size() + 1;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int type = getItemViewType(i);
if (type == 0) {
if (view == null) {
view = new ChatOrUserCell(mContext);
((ChatOrUserCell)view).useBoldFont = true;
((ChatOrUserCell)view).usePadding = false;
((ChatOrUserCell)view).useSeparator = true;
}
TLRPC.User user = MessagesController.Instance.users.get(blockedContacts.get(i).user_id);
((ChatOrUserCell)view).setData(user, null, null, null, user.phone != null && user.phone.length() != 0 ? PhoneFormat.Instance.format("+" + user.phone) : "Unknown");
} else if (type == 1) {
if (view == null) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.settings_unblock_info_row_layout, viewGroup, false);
registerForContextMenu(view);
}
}
return view;
}
@Override
public int getItemViewType(int i) {
if(i == blockedContacts.size()) {
return 1;
}
return 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public boolean isEmpty() {
return blockedContacts.isEmpty();
}
}
}