package org.softeg.slartus.forpdaplus.fragments.qms; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.content.Loader; import android.text.Html; import android.text.TextUtils; 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.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import org.softeg.slartus.forpdaapi.IListItem; import org.softeg.slartus.forpdaapi.ProfileApi; import org.softeg.slartus.forpdaapi.classes.ListData; import org.softeg.slartus.forpdaapi.qms.QmsApi; import org.softeg.slartus.forpdaapi.qms.QmsUserTheme; import org.softeg.slartus.forpdaapi.qms.QmsUserThemes; import org.softeg.slartus.forpdaapi.qms.QmsUsers; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.Client; import org.softeg.slartus.forpdaplus.MainActivity; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.fragments.profile.ProfileFragment; import org.softeg.slartus.forpdaplus.listfragments.BaseLoaderListFragment; import org.softeg.slartus.forpdaplus.prefs.Preferences; import org.softeg.slartus.forpdaplus.tabs.ListViewMethodsBridge; import java.util.ArrayList; /** * Created by radiationx on 12.11.15. */ public class QmsContactThemes extends BaseLoaderListFragment { public static final String MID_KEY = "mid"; public static final String NICK_KEY = "nick"; ActionMode mMode; private String m_Id ; private String m_Nick = ""; private Boolean DeleteMode = false; @Override public void onResume() { super.onResume(); setArrow(); if (Preferences.Notifications.Qms.isReadDone()) reloadData(); } @Override public void onPause() { super.onPause(); } public static void showThemes(String userId, String userNick){ Bundle bundle = new Bundle(); bundle.putString("mid", userId); bundle.putString("nick", userNick); MainActivity.addTab(userNick, userId, newInstance(bundle)); } public static QmsContactThemes newInstance(Bundle args){ QmsContactThemes fragment=new QmsContactThemes(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setArrow(); if(savedInstanceState!=null){ m_Id = savedInstanceState.getString(MID_KEY); m_Nick = savedInstanceState.getString(NICK_KEY); }else if(getArguments()!=null){ m_Id = getArguments().getString(MID_KEY); m_Nick = getArguments().getString(NICK_KEY); } if(m_Nick!=null) if(m_Nick.equals("")) new GetUserTask(m_Id).execute(); } private class GetUserTask extends AsyncTask<String, Void, Boolean> { private String userId; private String userNick; public GetUserTask(String userId) { this.userId = userId; } @Override protected Boolean doInBackground(String... params) { try { userNick = ProfileApi.getUserNick(Client.getInstance(), userId); return true; } catch (Exception e) { ex = e; return false; } } protected void onPreExecute() { Toast.makeText(getContext(), R.string.getting_user_nick, Toast.LENGTH_SHORT).show(); } private Exception ex; protected void onPostExecute(final Boolean success) { if (success && !TextUtils.isEmpty(userNick)) { m_Nick = userNick; Toast.makeText(App.getContext(), App.getContext().getString(R.string.nick_received)+": " + m_Nick, Toast.LENGTH_SHORT).show(); setTitle(m_Nick); App.getInstance().getTabByTag(getTag()).setTitle(m_Nick); getMainActivity().notifyTabAdapter(); } else { if (ex != null) AppLog.e(getMainActivity(), ex, () -> new GetUserTask(userId).execute()); else if (TextUtils.isEmpty(userNick)) Toast.makeText(getMainActivity(), R.string.error_getting_nick, Toast.LENGTH_SHORT).show(); else Toast.makeText(getMainActivity(), R.string.unknown_error, Toast.LENGTH_SHORT).show(); } } } private boolean dialogShowed = false; @Override public void onLoadFinished(Loader<ListData> loader, ListData data) { super.onLoadFinished(loader, data); if(data.getItems().size()<=0&!dialogShowed) { new MaterialDialog.Builder(getContext()) .content(String.format(App.getContext().getString(R.string.ask_create_dialog), m_Nick)) .positiveText(R.string.yes) .negativeText(R.string.no) .onPositive((dialog, which) -> QmsNewThreadFragment.showUserNewThread(getMainActivity(), m_Id, m_Nick)) .show(); dialogShowed = true; } } @Override protected Boolean useCache() { return false; } @Override protected BaseAdapter createAdapter() { return new QmsContactsAdapter(getMainActivity(), getData().getItems()); } @Override protected int getViewResourceId() { return R.layout.list_fragment; } @Override protected ListData loadData(int loaderId, Bundle args) throws Throwable { ListData listData = new ListData(); QmsUsers qmsUsers = new QmsUsers(); QmsUserThemes mails = QmsApi.getQmsUserThemes(Client.getInstance(), m_Id, qmsUsers, TextUtils.isEmpty(m_Nick)); listData.getItems().addAll(mails); Client.getInstance().setQmsCount(qmsUsers.unreadMessageUsersCount()); Client.getInstance().doOnMailListener(); return listData; } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { l = ListViewMethodsBridge.getItemId(getMainActivity(), i, l); if (l < 0 || getAdapter().getCount() <= l) return; QmsUserTheme item = (QmsUserTheme) getAdapter().getItem((int) l); if (DeleteMode) { item.setSelected(!item.isSelected()); getAdapter().notifyDataSetChanged(); } else { QmsChatFragment.openChat(m_Id, m_Nick, item.Id, item.Title); //org.softeg.slartus.forpdaplus.qms.QmsChatActivity.openChat(getMainActivity(), m_Id, m_Nick, item.Id, item.Title); } } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if(!DeleteMode) startDeleteMode(); return true; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.add(R.string.new_thread) .setIcon(R.drawable.pencil) .setOnMenuItemClickListener(menuItem -> { QmsNewThreadFragment.showUserNewThread(getMainActivity(), m_Id, m_Nick); return true; }).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(R.string.profile_interlocutor) .setOnMenuItemClickListener(menuItem -> { ProfileFragment.showProfile(m_Id, m_Nick); return true; }).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } private void startDeleteMode() { mMode = getMainActivity().startActionMode(new AnActionModeOfEpicProportions()); DeleteMode = true; getListView().setSelection(AbsListView.CHOICE_MODE_MULTIPLE); getAdapter().notifyDataSetChanged(); } private void stopDeleteMode(Boolean finishActionMode) { if (finishActionMode && mMode != null) { mMode.finish(); } DeleteMode = false; getListView().setSelection(AbsListView.CHOICE_MODE_NONE); getAdapter().notifyDataSetChanged(); } private void deleteSelectedDialogs() { ArrayList<String> ids = new ArrayList<>(); for (IListItem item : getData().getItems()) { QmsUserTheme theme=(QmsUserTheme)item; if (theme.isSelected()) ids.add(theme.Id); } new DeleteTask(getMainActivity(), ids).execute(); } private final class AnActionModeOfEpicProportions implements ActionMode.Callback { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //Used to put dark icons on light action bar menu.add(R.string.delete) .setIcon(R.drawable.delete) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { Boolean anySelected=false; for (IListItem listItem : getData().getItems()) { QmsUserTheme theme=(QmsUserTheme)listItem; if (theme.isSelected()) { anySelected = true; break; } } if (anySelected) new MaterialDialog.Builder(getMainActivity()) .title(R.string.confirm_action) .content(String.format(getString(R.string.ask_deleting_dialogs), m_Nick)) .positiveText(R.string.ok) .onPositive((materialDialog, dialogAction) -> { mode.finish(); deleteSelectedDialogs(); }) .negativeText(R.string.cancel) .show(); return true; } @Override public void onDestroyActionMode(ActionMode mode) { stopDeleteMode(false); } } private class DeleteTask extends AsyncTask<String, Void, Boolean> { private final MaterialDialog dialog; ArrayList<String> m_Ids; private Throwable ex; public DeleteTask(Context context, ArrayList<String> ids) { m_Ids = ids; dialog = new MaterialDialog.Builder(context) .progress(true, 0) .content(App.getContext().getString(R.string.deleting_dialogs)) .build(); } @Override protected Boolean doInBackground(String... params) { try { QmsApi.deleteDialogs(Client.getInstance(), m_Id, m_Ids); return true; } catch (Throwable e) { ex = e; return false; } } // can use UI thread here protected void onPreExecute() { this.dialog.show(); } // can use UI thread here protected void onPostExecute(final Boolean success) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } stopDeleteMode(true); if (!success) { if (ex != null) AppLog.e(getMainActivity(), ex); else Toast.makeText(getMainActivity(), R.string.unknown_error, Toast.LENGTH_SHORT).show(); } reloadData(); } } public class QmsContactsAdapter extends BaseAdapter { private LayoutInflater m_Inflater; private ArrayList<IListItem> dataList; public QmsContactsAdapter(Context context, ArrayList<IListItem> objects) { m_Inflater = LayoutInflater.from(context); dataList = objects; } @Override public int getCount() { return dataList.size(); } @Override public Object getItem(int p1) { return dataList.get(p1); } @Override public long getItemId(int p1) { return p1; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = m_Inflater.inflate(R.layout.qms_contact_theme_item, parent, false); holder = new ViewHolder(); //holder.txtIsNew = (ImageView) convertView.findViewById(R.id.txtIsNew); holder.txtCount = (TextView) convertView.findViewById(R.id.txtMessagesCount); holder.txtAllCount = (TextView) convertView.findViewById(R.id.txtAllMessagesCount); holder.txtNick = (TextView) convertView.findViewById(R.id.txtNick); holder.txtDateTime = (TextView) convertView.findViewById(R.id.txtDateTime); holder.checkbox = (CheckBox) convertView.findViewById(R.id.text1); holder.checkbox .setOnCheckedChangeListener((buttonView, isChecked) -> { QmsUserTheme theme = (QmsUserTheme) holder.checkbox .getTag(); theme.setSelected(buttonView.isChecked()); }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.checkbox.setVisibility(DeleteMode ? View.VISIBLE : View.GONE); QmsUserTheme user = (QmsUserTheme) this.getItem(position); holder.checkbox.setTag(user); holder.txtNick.setText(Html.fromHtml(user.Title).toString()); holder.txtDateTime.setText(user.Date); if (!TextUtils.isEmpty(user.NewCount)) { holder.txtCount.setText(user.NewCount); holder.txtAllCount.setText(user.Count); switch (App.getInstance().getPreferences().getString("mainAccentColor", "pink")) { case "pink": holder.txtCount.setBackgroundResource(R.drawable.qmsnew); break; case "blue": holder.txtCount.setBackgroundResource(R.drawable.qmsnewblue); break; case "gray": holder.txtCount.setBackgroundResource(R.drawable.qmsnewgray); break; } //holder.txtIsNew.setImageResource(R.drawable.new_flag); holder.txtNick.setTextAppearance(getContext(), R.style.QmsNew); holder.txtCount.setTextAppearance(getContext(), R.style.QmsNew); } else { holder.txtAllCount.setText(user.Count); holder.txtCount.setBackgroundColor(getResources().getColor(android.R.color.transparent)); //holder.txtIsNew.setImageBitmap(null); holder.txtNick.setTextAppearance(getContext(), R.style.QmsOld); holder.txtCount.setTextAppearance(getContext(), R.style.QmsOld); } holder.checkbox.setChecked(user.isSelected()); return convertView; } private Context getContext() { return m_Inflater.getContext(); } public class ViewHolder { //ImageView txtIsNew; TextView txtNick; TextView txtDateTime; TextView txtCount; TextView txtAllCount; CheckBox checkbox; } } }