/*
* Copyright (c) 2016 Magnet Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.magnet.samples.android.quickstart.activities;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import com.magnet.max.android.User;
import com.magnet.mmx.client.api.ListResult;
import com.magnet.mmx.client.api.MMXChannel;
import com.magnet.samples.android.quickstart.R;
import com.magnet.samples.android.quickstart.adapters.ChannelListAdapter;
import com.magnet.samples.android.quickstart.util.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;
public class FindChannelActivity extends BaseActivity implements AdapterView.OnItemLongClickListener, AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener {
private Spinner modeChooser;
private EditText searchText;
private ListView searchResult;
private ChannelListAdapter adapter;
private List<MMXChannel> mChannels;
private AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_find_channel);
modeChooser = (Spinner) findViewById(R.id.findChannelMode);
modeChooser.setOnItemSelectedListener(this);
searchText = (EditText) findViewById(R.id.findChannelText);
searchResult = (ListView) findViewById(R.id.findChannelResult);
searchResult.setOnItemLongClickListener(this);
searchResult.setOnItemClickListener(this);
findViewById(R.id.findChannelBtn).setOnClickListener(this);
}
@Override
public void onClick(View v) {
hideKeyboard();
switch (v.getId()) {
case R.id.findChannelBtn:
runSearch();
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (adapter != null) {
Intent intent = new Intent(this, ChannelActivity.class);
intent.putExtra(ChannelActivity.TAG_SELECTED_CHANNEL, adapter.getItem(position).getName());
intent.putExtra(ChannelActivity.TAG_IS_PUBLIC, adapter.getItem(position).isPublic());
startActivity(intent);
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
case 1:
searchText.setHint("Name");
break;
case 2:
case 3:
searchText.setHint("Prefix");
break;
case 4:
searchText.setHint("Tag1, Tag2, Tag3");
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
protected void onPause() {
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
super.onPause();
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (adapter != null) {
MMXChannel selectedChannel = adapter.getItem(position);
if (User.getCurrentUserId().equals(selectedChannel.getOwnerId())) {
showDialogForDeleteChannel(selectedChannel);
}
}
return false;
}
private void runSearch() {
String query = searchText.getText().toString();
if (!query.isEmpty()) {
switch (modeChooser.getSelectedItemPosition()) {
case 0:
getChannelByName(query, true);
break;
case 1:
getChannelByName(query, false);
break;
case 2:
searchStartedWith(query, true);
break;
case 3:
searchStartedWith(query, false);
break;
case 4:
searchByTags(query);
break;
}
}
}
private void showDialogForDeleteChannel(final MMXChannel channel) {
if (alertDialog == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure that you want to delete channel?");
builder.setCancelable(false);
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
}
});
alertDialog = builder.create();
}
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteChannel(channel);
}
});
alertDialog.show();
}
private void deleteChannel(MMXChannel channel) {
channel.delete(new MMXChannel.OnFinishedListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
runSearch();
showMessage("Channel was deleted");
Logger.debug("delete channel", "success");
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
showMessage("Can't delete channel : " + failureCode + " : " + throwable.getMessage());
Logger.error("delete channel", throwable, "error : ", failureCode);
}
});
}
private void searchByTags(String query) {
HashSet<String> tags = getTagsFromString(query);
MMXChannel.findByTags(tags, 100, 0, finishedListener);
}
private void getChannelByName(String name, boolean isPublic) {
final String tag = "get " + (isPublic ? "public" : "private") + " channel by name ";
MMXChannel.OnFinishedListener<MMXChannel> listener = new MMXChannel.OnFinishedListener<MMXChannel>() {
@Override
public void onSuccess(MMXChannel mmxChannel) {
Logger.debug(tag, "success");
updateList(Arrays.asList(mmxChannel));
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
showMessage("Can't " + tag + failureCode + " : " + throwable.getMessage());
Logger.error(tag, throwable, "error : ", failureCode);
}
};
if(isPublic) {
MMXChannel.getPublicChannel(name, listener);
} else {
MMXChannel.getPrivateChannel(name, listener);
}
}
private void searchStartedWith(String query, boolean isPublic) {
if(isPublic) {
MMXChannel.findPublicChannelsByName(query, 100, 0, finishedListener);
} else {
MMXChannel.findPrivateChannelsByName(query, 100, 0, finishedListener);
}
}
private void updateList(List<MMXChannel> channels) {
if(null == adapter) {
mChannels = new ArrayList<>(channels);
adapter = new ChannelListAdapter(this, mChannels);
searchResult.setAdapter(adapter);
} else {
mChannels.clear();
mChannels.addAll(channels);
adapter.notifyDataSetChanged();
if(null == channels || channels.isEmpty()) {
showMessage("No channel matches");
}
}
}
private HashSet<String> getTagsFromString(String line) {
StringTokenizer tokenizer = new StringTokenizer(line, ",");
HashSet<String> hashSet = new HashSet<>();
while (tokenizer.hasMoreTokens()) {
hashSet.add(tokenizer.nextToken().trim());
}
return hashSet;
}
private final MMXChannel.OnFinishedListener<ListResult<MMXChannel>> finishedListener = new MMXChannel.OnFinishedListener<ListResult<MMXChannel>>() {
@Override
public void onSuccess(ListResult<MMXChannel> mmxChannelListResult) {
Logger.debug("find channels", "success");
updateList(mmxChannelListResult.items);
}
@Override
public void onFailure(MMXChannel.FailureCode failureCode, Throwable throwable) {
showMessage("Can't find channels : " + failureCode + " : " + throwable.getMessage());
Logger.error("find channels", throwable, "error : ", failureCode);
}
};
}