aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/StatusFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/StatusFragment.java')
-rw-r--r--main/src/cgeo/geocaching/StatusFragment.java110
1 files changed, 110 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/StatusFragment.java b/main/src/cgeo/geocaching/StatusFragment.java
new file mode 100644
index 0000000..5a9a5b4
--- /dev/null
+++ b/main/src/cgeo/geocaching/StatusFragment.java
@@ -0,0 +1,110 @@
+package cgeo.geocaching;
+
+import cgeo.geocaching.network.StatusUpdater.Status;
+import cgeo.geocaching.utils.IObserver;
+import cgeo.geocaching.utils.Log;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+public class StatusFragment extends Fragment {
+
+ private ViewGroup status;
+ private ImageView statusIcon;
+ private TextView statusMessage;
+
+ final private StatusHandler statusHandler = new StatusHandler();
+
+ @Override
+ public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ status = (ViewGroup) inflater.inflate(R.layout.status, container, false);
+ statusIcon = (ImageView) status.findViewById(R.id.status_icon);
+ statusMessage = (TextView) status.findViewById(R.id.status_message);
+ return status;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ cgeoapplication.getInstance().getStatusUpdater().addObserver(statusHandler);
+ }
+
+ @Override
+ public void onPause() {
+ cgeoapplication.getInstance().getStatusUpdater().deleteObserver(statusHandler);
+ super.onPause();
+ }
+
+ private class StatusHandler extends Handler implements IObserver<Status> {
+
+ @Override
+ public void update(final Status data) {
+ obtainMessage(0, data).sendToTarget();
+ }
+
+ @Override
+ public void handleMessage(final Message msg) {
+ final Status data = (Status) msg.obj;
+ updateDisplay(data != null && data.message != null ? data : null);
+ }
+
+ private void updateDisplay(final Status data) {
+
+ if (data == null) {
+ status.setVisibility(View.INVISIBLE);
+ return;
+ }
+
+ final Resources res = getResources();
+ final String packageName = getActivity().getPackageName();
+
+ if (data.icon != null) {
+ final int iconId = res.getIdentifier(data.icon, "drawable", packageName);
+ if (iconId != 0) {
+ statusIcon.setImageResource(iconId);
+ statusIcon.setVisibility(View.VISIBLE);
+ } else {
+ Log.w("StatusHandler: could not find icon corresponding to @drawable/" + data.icon);
+ statusIcon.setVisibility(View.GONE);
+ }
+ } else {
+ statusIcon.setVisibility(View.GONE);
+ }
+
+ String message = data.message;
+ if (data.messageId != null) {
+ final int messageId = res.getIdentifier(data.messageId, "string", packageName);
+ if (messageId != 0) {
+ message = res.getString(messageId);
+ }
+ }
+
+ statusMessage.setText(message);
+ status.setVisibility(View.VISIBLE);
+
+ if (data.url != null) {
+ status.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(final View v) {
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(data.url)));
+ }
+ });
+ } else {
+ status.setClickable(false);
+ }
+ }
+
+ }
+}