blob: 1ab6c4ef0e0be124dcc411476cd147b084b173a6 [file] [log] [blame]
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* 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.samples.apps.iosched.iowear;
import static com.google.samples.apps.iosched.iowear.utils.Utils.LOGD;
import static com.google.samples.apps.iosched.iowear.utils.Utils.makeLogTag;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
import com.google.samples.apps.iosched.R;
import com.google.samples.apps.iosched.iowear.utils.Utils;
import com.google.samples.apps.iosched.iowear.fragments.FeedbackFragment;
import com.google.samples.apps.iosched.iowear.fragments.RadioFragment;
import com.google.samples.apps.iosched.iowear.fragments.StarFragment;
import com.google.samples.apps.iosched.iowear.fragments.SubmitFragment;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.WindowManager;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
/**
* The main activity tht build all pages of a session feedback.
*/
public class PagerActivity extends Activity
implements OnQuestionAnsweredListener, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final long PAGE_FLIP_DELAY_MS = 2000; // in millis
private ViewPager mViewPager;
private static final String TAG = makeLogTag("PagerActivity");
private List<FeedbackFragment> mFragments = new ArrayList<FeedbackFragment>();
private Timer mTimer;
private TimerTask mTimerTask;
private Handler mHandler;
private Map<Integer, Integer> responses = new HashMap<Integer, Integer>();
private GoogleApiClient mGoogleApiClient;
private String mSessionId;
private ImageView[] indicators = null;
private int[] mSavedResponses;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pager);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mHandler = new Handler();
setupViews();
if (getIntent().hasExtra(HomeListenerService.KEY_SESSION_ID)) {
mSessionId = getIntent().getExtras().getString(HomeListenerService.KEY_SESSION_ID);
LOGD(TAG, "Session received from service: " + mSessionId);
}
// if there is any prior persisted answers for this feedback, lets load them.
mSavedResponses = Utils.getPersistedResponses(this, mSessionId);
Utils.saveSessionId(this, mSessionId);
for (int i = 0; i < 4; i++) {
LOGD(TAG, "Response " + i + ": " + mSavedResponses[i]);
if (mSavedResponses[i] > -1) {
responses.put(i, mSavedResponses[i]);
}
}
final PagerAdapter adapter = new PagerAdapter(getFragmentManager());
StarFragment fragment0 = StarFragment.newInstance(0, mSavedResponses[0]);
RadioFragment fragment1 = RadioFragment.newInstance(1, mSavedResponses[1]);
RadioFragment fragment2 = RadioFragment.newInstance(2, mSavedResponses[2]);
RadioFragment fragment3 = RadioFragment.newInstance(3, mSavedResponses[3]);
mFragments.add(fragment0);
mFragments.add(fragment1);
mFragments.add(fragment2);
mFragments.add(fragment3);
for (FeedbackFragment f : mFragments) {
f.setOnQuestionListener(this);
adapter.addFragment(f);
}
adapter.addFragment(new SubmitFragment(this));
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
clearTimer();
setIndicator(i);
if (i == 0) {
mFragments.get(i).reshowQuestion();
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onQuestionAnswered(int questionNumber, int responseNumber) {
LOGD(TAG, "Question Answered: " + questionNumber + " -> " + responseNumber);
Utils.saveResponse(this, questionNumber, responseNumber);
renewTimer(questionNumber + 1);
responses.put(questionNumber, responseNumber);
}
@Override
public void submit() {
// do the submission
Intent finishIntent = new Intent(this, FinishActivity.class);
try {
PutDataRequest dataRequest = buildDataRequest();
if (mGoogleApiClient.isConnected()) {
Wearable.DataApi.putDataItem(
mGoogleApiClient, dataRequest)
.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
if (!dataItemResult.getStatus().isSuccess()) {
LOGD(TAG, "Failed to send back responses, status: "
+ dataItemResult.getStatus());
}
}
});
} else {
Log.e(TAG, "submit() Failed to send data to phone since there was no Google API "
+ "client connectivity");
}
} catch (JSONException e) {
Log.e(TAG, "Failed to build a json from responses", e);
}
// remove local notification upon submission
NotificationManagerCompat.from(this)
.cancel(mSessionId, HomeListenerService.NOTIFICATION_ID);
// clear persisted local data
Utils.clearResponses(this);
startActivity(finishIntent);
finish();
}
/**
* Builds a {@link com.google.android.gms.wearable.PutDataRequest} which holds a JSON
* representation of the feedback collected.
*/
private PutDataRequest buildDataRequest() throws JSONException {
PutDataMapRequest putDataMapRequest = PutDataMapRequest
.create(HomeListenerService.PATH_RESPONSE);
DataMap dataMap = putDataMapRequest.getDataMap();
JSONArray jsonArray = new JSONArray();
if (!responses.isEmpty()) {
JSONObject sessionObj = new JSONObject();
sessionObj.put("s", mSessionId);
jsonArray.put(0, sessionObj);
int i = 1;
for (Integer key : responses.keySet()) {
JSONObject obj = new JSONObject();
obj.put("q", key);
obj.put("a", responses.get(key));
jsonArray.put(i++, obj);
}
}
String response = jsonArray.toString();
LOGD(TAG, "JSON representation of the response: " + response);
dataMap.putString("response", response);
return putDataMapRequest.asPutDataRequest();
}
/**
* Renews the timer that causes pages to flip upon providing an answer.
*/
private void renewTimer(final int targetPage) {
clearTimer();
mTimerTask = new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(targetPage);
}
});
}
};
mTimer = new Timer();
mTimer.schedule(mTimerTask, PAGE_FLIP_DELAY_MS);
}
/**
* Clear the timer that flips the pages.
*/
private void clearTimer() {
if (null != mTimer) {
mTimer.cancel();
}
}
@Override
public void onConnected(Bundle bundle) {
LOGD(TAG, "onConnected() Connected to Google Api Service");
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.e(TAG, "onConnectionFailed(): Connection to Google Api Service failed with result: "
+ connectionResult);
}
private void setupViews() {
mViewPager = (ViewPager) findViewById(R.id.pager);
indicators = new ImageView[5];
indicators[0] = (ImageView) findViewById(R.id.indicator_0);
indicators[1] = (ImageView) findViewById(R.id.indicator_1);
indicators[2] = (ImageView) findViewById(R.id.indicator_2);
indicators[3] = (ImageView) findViewById(R.id.indicator_3);
indicators[4] = (ImageView) findViewById(R.id.indicator_4);
}
/**
* Sets the page indicator for the ViewPager
*/
private void setIndicator(int i) {
for (int k = 0; k < indicators.length; k++) {
indicators[k].setImageResource(i == k
? R.drawable.page_dot_full : R.drawable.page_dot_empty);
}
}
}