| Index: third_party/cacheinvalidation/src/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java
|
| diff --git a/third_party/cacheinvalidation/src/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java b/third_party/cacheinvalidation/src/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e748ff69a7f929466bdb3052003e2f732bd228f4
|
| --- /dev/null
|
| +++ b/third_party/cacheinvalidation/src/javaexample/com/google/ipc/invalidation/examples/android2/MainActivity.java
|
| @@ -0,0 +1,221 @@
|
| +/*
|
| + * Copyright 2011 Google 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.google.ipc.invalidation.examples.android2;
|
| +
|
| +import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener;
|
| +import com.google.ipc.invalidation.external.client.types.ObjectId;
|
| +
|
| +import android.app.Activity;
|
| +import android.content.Context;
|
| +import android.os.Bundle;
|
| +import android.util.Log;
|
| +import android.view.View;
|
| +import android.view.View.OnClickListener;
|
| +import android.view.ViewGroup.LayoutParams;
|
| +import android.widget.Button;
|
| +import android.widget.EditText;
|
| +import android.widget.LinearLayout;
|
| +import android.widget.TextView;
|
| +
|
| +import java.nio.charset.Charset;
|
| +
|
| +/**
|
| + * A simple sample application that displays information about object registrations and
|
| + * versions.
|
| + *
|
| + * <p>To submit invalidations, you can run the ExampleServlet:
|
| + *
|
| + * <p><code>
|
| + * blaze run java/com/google/ipc/invalidation/examples:ExampleServlet -- \
|
| + --publisher_spec="" \
|
| + --port=8888 \
|
| + --channel_uri="talkgadget.google.com"
|
| + * </code>
|
| + *
|
| + * <p>and open http://localhost:8888/publisher.
|
| + *
|
| + * <p>Just publish invalidations with ids similar to 'Obj1', 'Obj2', ... 'Obj3'
|
| + *
|
| + */
|
| +public final class MainActivity extends Activity {
|
| +
|
| + /** Tag used in logging. */
|
| + private static final String TAG = "TEA2:MainActivity";
|
| +
|
| + /**
|
| + * Keep track of current registration and object status. This should probably be implemented
|
| + * using intents rather than static state but I don't want to distract from the invalidation
|
| + * client essentials in this example.
|
| + */
|
| + public static final class State {
|
| + private static volatile String info;
|
| + private static volatile MainActivity currentActivity;
|
| +
|
| + public static void setInfo(String info) {
|
| + State.info = info;
|
| + refreshInfo();
|
| + }
|
| + }
|
| +
|
| + /** Text view showing current {@link ExampleListenerState}. */
|
| + private TextView info;
|
| +
|
| + /** Text view used to display error messages. */
|
| + private TextView error;
|
| +
|
| + /** Called when the activity is first created. */
|
| + @Override
|
| + public void onCreate(Bundle savedInstanceState) {
|
| + Log.i(TAG, "[onCreate] Creating main activity");
|
| + super.onCreate(savedInstanceState);
|
| +
|
| + MultiplexingGcmListener.initializeGcm(this);
|
| +
|
| + // Setup UI.
|
| + LinearLayout layout = new LinearLayout(this);
|
| + layout.setOrientation(LinearLayout.VERTICAL);
|
| + layout.addView(createClientLifetimeButtons(), LayoutParams.WRAP_CONTENT);
|
| + layout.addView(createRegistrationControls(), LayoutParams.WRAP_CONTENT);
|
| + error = new TextView(this);
|
| + layout.addView(error, LayoutParams.WRAP_CONTENT);
|
| + info = new TextView(this);
|
| + layout.addView(info, LayoutParams.WRAP_CONTENT);
|
| + setContentView(layout);
|
| +
|
| + // Remember the current activity since the TICL service in this example communicates via
|
| + // static state.
|
| + State.currentActivity = this;
|
| + Log.i(TAG, "[onCreate] Calling refresh data from main activity");
|
| + refreshInfo();
|
| + }
|
| +
|
| + /** Creates start and stop buttons. */
|
| + private View createClientLifetimeButtons() {
|
| + LinearLayout layout = new LinearLayout(this);
|
| + layout.setOrientation(LinearLayout.HORIZONTAL);
|
| +
|
| + // Start button.
|
| + Button startButton = new Button(this);
|
| + startButton.setText("Start");
|
| + startButton.setOnClickListener(new OnClickListener() {
|
| + @Override
|
| + public void onClick(View v) {
|
| + v.getContext().startService(ExampleListener.createStartIntent(v.getContext()));
|
| + }
|
| + });
|
| + layout.addView(startButton, LayoutParams.WRAP_CONTENT);
|
| +
|
| + // Stop button.
|
| + Button stopButton = new Button(this);
|
| + stopButton.setText("Stop");
|
| + stopButton.setOnClickListener(new OnClickListener() {
|
| + @Override
|
| + public void onClick(View v) {
|
| + v.getContext().startService(ExampleListener.createStopIntent(v.getContext()));
|
| + }
|
| + });
|
| + layout.addView(stopButton, LayoutParams.WRAP_CONTENT);
|
| +
|
| + return layout;
|
| + }
|
| +
|
| + private View createRegistrationControls() {
|
| + LinearLayout layout = new LinearLayout(this);
|
| + layout.setOrientation(LinearLayout.VERTICAL);
|
| +
|
| + // Create the source text field
|
| + LinearLayout fieldsLayout = new LinearLayout(this);
|
| + fieldsLayout.setOrientation(LinearLayout.HORIZONTAL);
|
| + TextView sourceText = new TextView(this);
|
| + sourceText.setText("source:");
|
| + fieldsLayout.addView(sourceText, LayoutParams.WRAP_CONTENT);
|
| + final EditText sourceField = new EditText(this);
|
| + sourceField.setText("DEMO");
|
| + fieldsLayout.addView(sourceField, LayoutParams.WRAP_CONTENT);
|
| +
|
| + // Create the name text field
|
| + TextView nameText = new TextView(this);
|
| + nameText.setText("name:");
|
| + fieldsLayout.addView(nameText, LayoutParams.WRAP_CONTENT);
|
| + final EditText nameField = new EditText(this);
|
| + nameField.setText("Obj1");
|
| + fieldsLayout.addView(nameField, LayoutParams.WRAP_CONTENT);
|
| + layout.addView(fieldsLayout, LayoutParams.WRAP_CONTENT);
|
| +
|
| + // Shared click listener class for registration (register and unregister).
|
| + abstract class RegistrationClickListener implements OnClickListener {
|
| + @Override
|
| + public void onClick(View v) {
|
| + String sourceText = sourceField.getText().toString();
|
| + // Build object id from relevant fields. Can't use reflection because this is Android.
|
| + final int source;
|
| + if ("DEMO".equals(sourceText)) {
|
| + source = 4;
|
| + } else if ("TEST".equals(sourceText)) {
|
| + source = 2;
|
| + } else {
|
| + error.setText("Unrecognized source: " + sourceText);
|
| + return;
|
| + }
|
| +
|
| + String name = nameField.getText().toString();
|
| + ObjectId objectId =
|
| + ObjectId.newInstance(source, name.getBytes(Charset.forName("UTF-8")));
|
| + performRegistration(v.getContext(), objectId);
|
| + }
|
| +
|
| + abstract void performRegistration(Context context, ObjectId objectId);
|
| + }
|
| +
|
| + // Create the reg/unreg buttons
|
| + LinearLayout buttonsLayout = new LinearLayout(this);
|
| + buttonsLayout.setOrientation(LinearLayout.HORIZONTAL);
|
| + Button regButton = new Button(this);
|
| + regButton.setText("Register");
|
| + regButton.setOnClickListener(new RegistrationClickListener() {
|
| + @Override
|
| + void performRegistration(Context context, ObjectId objectId) {
|
| + context.startService(ExampleListener.createRegisterIntent(context, objectId));
|
| + }
|
| + });
|
| + Button unregButton = new Button(this);
|
| + unregButton.setText("Unregister");
|
| + unregButton.setOnClickListener(new RegistrationClickListener() {
|
| + @Override
|
| + void performRegistration(Context context, ObjectId objectId) {
|
| + context.startService(ExampleListener.createUnregisterIntent(context, objectId));
|
| + }
|
| + });
|
| + buttonsLayout.addView(regButton, LayoutParams.WRAP_CONTENT);
|
| + buttonsLayout.addView(unregButton, LayoutParams.WRAP_CONTENT);
|
| + layout.addView(buttonsLayout, LayoutParams.WRAP_CONTENT);
|
| + return layout;
|
| + }
|
| +
|
| + /** Updates UI with current registration status and object versions. */
|
| + private static void refreshInfo() {
|
| + final MainActivity activity = State.currentActivity;
|
| + if (null != activity) {
|
| + activity.info.post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + activity.info.setText(State.info);
|
| + }
|
| + });
|
| + }
|
| + }
|
| +}
|
|
|