package com.amazon.aws.demo.sns; import java.util.List; import com.amazon.aws.demo.AlertActivity; import com.amazon.aws.demo.R; import com.amazon.aws.demo.sqs.SimpleQueue; import android.os.Bundle; import android.os.Handler; import android.view.Gravity; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; public class SnsSubscribe extends AlertActivity{ protected ArrayAdapter<String> topicListAdapter; protected ArrayAdapter<String> queueListAdapter; protected Spinner topicSpinner; protected Spinner protocolSpinner; protected EditText endpointInput; protected TextView topicIntro; protected TextView protoIntro; protected TextView endpointIntro; protected Spinner endpointSpinner; protected Button submitButton; protected Handler mHandler; protected List<String> topicArns; protected List<String> queueUrls; private int inputTextStatus; public static final int INPUT_TEXT_ON = 0; public static final int INPUT_TEXT_OFF = 1; public static final int POLICY_PROPAGATION_TIME_IN_SECONDS = 12; private Runnable postResults = new Runnable() { @Override public void run(){ updateUi(); } }; private Runnable postDone = new Runnable() { @Override public void run(){ finish(); } }; private Runnable postProp = new Runnable() { @Override public void run(){ clearUi(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sns_subscribe); topicSpinner = (Spinner) findViewById(R.id.sns_sub_topic_spinner); protocolSpinner = (Spinner) findViewById(R.id.sns_sub_protocol_spinner); endpointSpinner = (Spinner) findViewById(R.id.sns_sub_endpoint_spinner); endpointInput = (EditText) findViewById(R.id.sns_sub_endpoint_input); submitButton = (Button) findViewById(R.id.sns_sub_submit_button); topicIntro = (TextView) findViewById(R.id.sns_sub_topic_intro_text); protoIntro = (TextView) findViewById(R.id.sns_sub_protocol_intro_text); endpointIntro = (TextView) findViewById(R.id.sns_sub_endpoint_intro_text); mHandler = new Handler(); inputTextStatus = INPUT_TEXT_ON; getTopicArn(); wireOnSelect(); } private void getTopicArn(){ Thread t = new Thread(){ @Override public void run(){ try{ topicArns = SimpleNotification.getTopicNames(); queueUrls = SimpleQueue.getQueueUrls(); mHandler.post(postResults); } catch(Throwable e){ setStackAndPost(e); } } }; t.start(); } private void subscribeQueue(String url, String arn){ final String tUrl = url; final String tArn = arn; Thread t = new Thread(){ @Override public void run(){ try { SimpleQueue.allowNotifications(tUrl,tArn); mHandler.post(postProp); } catch (Throwable e) { setStackAndPost(e); } try { Thread.sleep(POLICY_PROPAGATION_TIME_IN_SECONDS * 1000); } catch (InterruptedException e) { e.printStackTrace(); } try { String end = SimpleQueue.getQueueArn(tUrl); SimpleNotification.subscribe(tArn, (String)protocolSpinner.getSelectedItem(), end); mHandler.post(postDone); } catch(Throwable e) { setStackAndPost(e); } } }; t.start(); } private void wireSubmitButton(){ submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { topicSpinner.setVisibility(View.INVISIBLE); protocolSpinner.setVisibility(View.INVISIBLE); String arn = (String)topicSpinner.getSelectedItem().toString(); if(inputTextStatus == INPUT_TEXT_ON) { endpointInput.setVisibility(View.GONE); try { SimpleNotification.subscribe(arn, (String)protocolSpinner.getSelectedItem(), endpointInput.getText().toString()); finish(); } catch (Throwable e ) { setStackAndPost(e); } } else { endpointSpinner.setVisibility(View.GONE); String url = (String)endpointSpinner.getSelectedItem().toString(); subscribeQueue(url, arn); } } }); } private void wireOnSelect(){ protocolSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { //Show Spinner for SQS if (position == 4) { swapField(INPUT_TEXT_OFF); } else { swapField(INPUT_TEXT_ON); } //Prefix web requests if(position == 0) { endpointInput.setText("http://"); } else if (position == 1){ endpointInput.setText("https://"); } else { endpointInput.setText(""); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private void updateUi(){ topicListAdapter = new ArrayAdapter<String>(this, R.layout.spinner_item, topicArns); queueListAdapter = new ArrayAdapter<String>(this, R.layout.spinner_item, queueUrls); topicSpinner.setAdapter(topicListAdapter); endpointSpinner.setAdapter(queueListAdapter); topicSpinner.setVisibility(View.VISIBLE); wireSubmitButton(); } private void clearUi(){ submitButton.setVisibility(View.INVISIBLE); topicIntro.setVisibility(View.INVISIBLE); protoIntro.setVisibility(View.INVISIBLE); endpointIntro.setText("Waiting for 12 Seconds For Subscribe to Propagate. . ."); endpointIntro.setGravity(Gravity.CENTER); } private void swapField(int i) { if(i == INPUT_TEXT_ON && inputTextStatus == INPUT_TEXT_OFF) { endpointSpinner.setVisibility(View.GONE); endpointInput.setVisibility(View.VISIBLE); inputTextStatus = INPUT_TEXT_ON; } else if(i == INPUT_TEXT_OFF && inputTextStatus == INPUT_TEXT_ON) { endpointInput.setVisibility(View.GONE); endpointSpinner.setVisibility(View.VISIBLE); inputTextStatus = INPUT_TEXT_OFF; } } }