package org.fox.ttrss.share; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import org.fox.ttrss.ApiRequest; import org.fox.ttrss.R; import org.fox.ttrss.types.FeedCategory; import org.fox.ttrss.types.FeedCategoryList; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; public class SubscribeActivity extends CommonShareActivity { private final String TAG = this.getClass().getSimpleName(); private Button m_postButton; private Button m_catButton; private CatListAdapter m_adapter; private FeedCategoryList m_cats = new FeedCategoryList(); private static final int REQ_CATS = 1; private static final int REQ_POST = 2; class CatTitleComparator implements Comparator { @Override public int compare(FeedCategory a, FeedCategory b) { if (a.id >= 0 && b.id >= 0) return a.title.compareTo(b.title); else return a.id - b.id; } } public void sortCats() { Comparator cmp = new CatTitleComparator(); Collections.sort(m_cats, cmp); try { m_adapter.notifyDataSetChanged(); } catch (NullPointerException e) { // adapter missing } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_LEFT_ICON); String urlValue = getIntent().getDataString(); if (urlValue == null) urlValue = getIntent().getStringExtra(Intent.EXTRA_TEXT); if (savedInstanceState != null) { urlValue = savedInstanceState.getString("url"); ArrayList list = savedInstanceState.getParcelableArrayList("cats"); for (FeedCategory c : list) m_cats.add(c); } setContentView(R.layout.subscribe); getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.icon); setSmallScreen(false); Spinner catList = (Spinner) findViewById(R.id.category_spinner); if (m_cats.size() == 0) m_cats.add(new FeedCategory(0, "Uncategorized", 0)); m_adapter = new CatListAdapter(this, android.R.layout.simple_spinner_dropdown_item, m_cats); catList.setAdapter(m_adapter); EditText feedUrl = (EditText) findViewById(R.id.feed_url); feedUrl.setText(urlValue); m_postButton = (Button) findViewById(R.id.subscribe_button); m_postButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { login(REQ_POST); } }); m_catButton = (Button) findViewById(R.id.cats_button); m_catButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { login(REQ_CATS); } }); login(REQ_CATS); } @Override public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); EditText url = (EditText) findViewById(R.id.url); if (url != null) { out.putString("url", url.getText().toString()); } out.putParcelableArrayList("cats", m_cats); } private void subscribeToFeed() { m_postButton.setEnabled(false); ApiRequest req = new ApiRequest(getApplicationContext()) { protected void onPostExecute(JsonElement result) { setProgressBarIndeterminateVisibility(false); if (m_lastError != ApiError.NO_ERROR) { toast(getErrorMessage()); } else { try { int rc = -1; try { rc = result.getAsJsonObject().get("status").getAsJsonObject().get("code").getAsInt(); } catch (Exception e) { e.printStackTrace(); } switch (rc) { case -1: toast(R.string.error_api_unknown); //finish(); break; case 0: toast(R.string.error_feed_already_exists_); //finish(); break; case 1: toast(R.string.subscribed_to_feed); finish(); break; case 2: toast(R.string.error_invalid_url); break; case 3: toast(R.string.error_url_is_an_html_page_no_feeds_found); break; case 4: toast(R.string.error_url_contains_multiple_feeds); break; case 5: toast(R.string.error_could_not_download_url); break; } } catch (Exception e) { toast(R.string.error_while_subscribing); e.printStackTrace(); } } m_postButton.setEnabled(true); } }; Spinner catSpinner = (Spinner) findViewById(R.id.category_spinner); final FeedCategory cat = (FeedCategory) m_adapter.getCategory(catSpinner.getSelectedItemPosition()); final EditText feedUrl = (EditText) findViewById(R.id.feed_url); if (feedUrl != null ) { HashMap map = new HashMap() { { put("sid", m_sessionId); put("op", "subscribeToFeed"); put("feed_url", feedUrl.getText().toString()); if (cat != null) { put("category_id", String.valueOf(cat.id)); } } }; setProgressBarIndeterminateVisibility(true); req.execute(map); } } @Override public void onLoggingIn(int requestId) { switch (requestId) { case REQ_CATS: m_catButton.setEnabled(false); break; case REQ_POST: m_postButton.setEnabled(false); break; } } private void updateCats() { ApiRequest req = new ApiRequest(getApplicationContext()) { protected void onPostExecute(JsonElement result) { setProgressBarIndeterminateVisibility(false); if (m_lastError != ApiError.NO_ERROR) { toast(getErrorMessage()); } else { JsonArray content = result.getAsJsonArray(); if (content != null) { Type listType = new TypeToken>() {}.getType(); final List cats = new Gson().fromJson(content, listType); m_cats.clear(); for (FeedCategory c : cats) { if (c.id > 0) m_cats.add(c); } sortCats(); m_cats.add(0, new FeedCategory(0, "Uncategorized", 0)); m_adapter.notifyDataSetChanged(); toast(R.string.category_list_updated); } } m_catButton.setEnabled(true); } }; HashMap map = new HashMap() { { put("sid", m_sessionId); put("op", "getCategories"); } }; setProgressBarIndeterminateVisibility(true); req.execute(map); } @Override protected void onLoggedIn(int requestId) { switch (requestId) { case REQ_CATS: updateCats(); break; case REQ_POST: m_postButton.setEnabled(true); if (m_apiLevel < 5) { toast(R.string.api_too_low); } else { subscribeToFeed(); } break; } } private class CatListAdapter extends ArrayAdapter { private List m_items; public CatListAdapter(Context context, int resource, List items) { super(context, resource); m_items = items; } @Override public String getItem(int item) { return m_items.get(item).title; } public FeedCategory getCategory(int item) { try { return m_items.get(item); } catch (ArrayIndexOutOfBoundsException e) { return null; } } @Override public int getCount() { return m_items.size(); } } }