Add pulldown to sync and tabs in the charts activity #138

master
cpfeiffer 2015-10-17 16:39:44 +02:00
parent a9186791dc
commit 45fc2c181c
3 changed files with 94 additions and 26 deletions

View File

@ -10,18 +10,24 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.content.LocalBroadcastManager; import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ProgressBar; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@ -32,18 +38,21 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBFragmentActivit
import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenter; import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenter;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class ChartsActivity extends AbstractGBFragmentActivity implements ChartsHost { public class ChartsActivity extends AbstractGBFragmentActivity implements ChartsHost {
private static final Logger LOG = LoggerFactory.getLogger(ChartsActivity.class); private static final Logger LOG = LoggerFactory.getLogger(ChartsActivity.class);
private ProgressBar mProgressBar;
private Button mPrevButton; private Button mPrevButton;
private Button mNextButton; private Button mNextButton;
private TextView mDateControl; private TextView mDateControl;
private Date mStartDate; private Date mStartDate;
private Date mEndDate; private Date mEndDate;
private SwipeRefreshLayout swipeLayout;
private PagerTabStrip mPagerTabStrip;
private ViewPager viewPager;
private static class ShowDurationDialog extends Dialog { private static class ShowDurationDialog extends Dialog {
private final String mDuration; private final String mDuration;
@ -92,11 +101,11 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
private void refreshBusyState(GBDevice dev) { private void refreshBusyState(GBDevice dev) {
if (dev.isBusy()) { if (dev.isBusy()) {
mProgressBar.setVisibility(View.VISIBLE); swipeLayout.setRefreshing(true);
} else { } else {
boolean wasBusy = mProgressBar.getVisibility() != View.GONE; boolean wasBusy = swipeLayout.isRefreshing();
if (wasBusy) { if (wasBusy) {
mProgressBar.setVisibility(View.GONE); swipeLayout.setRefreshing(false);
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(REFRESH)); LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(REFRESH));
} }
} }
@ -121,9 +130,31 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
throw new IllegalArgumentException("Must provide a device when invoking this activity"); throw new IllegalArgumentException("Must provide a device when invoking this activity");
} }
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.activity_swipe_layout);
swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
fetchActivityData();
}
});
// Set up the ViewPager with the sections adapter. // Set up the ViewPager with the sections adapter.
ViewPager viewPager = (ViewPager) findViewById(R.id.pager); viewPager = (ViewPager) findViewById(R.id.charts_pager);
viewPager.setAdapter(getPagerAdapter()); viewPager.setAdapter(getPagerAdapter());
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
enableSwipeRefresh(state == ViewPager.SCROLL_STATE_IDLE);
}
});
dateBar = (ViewGroup) findViewById(R.id.charts_date_bar); dateBar = (ViewGroup) findViewById(R.id.charts_date_bar);
mDateControl = (TextView) findViewById(R.id.charts_text_date); mDateControl = (TextView) findViewById(R.id.charts_text_date);
@ -135,7 +166,6 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
} }
}); });
mProgressBar = (ProgressBar) findViewById(R.id.charts_progress);
mPrevButton = (Button) findViewById(R.id.charts_previous); mPrevButton = (Button) findViewById(R.id.charts_previous);
mPrevButton.setOnClickListener(new View.OnClickListener() { mPrevButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -150,6 +180,9 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
handleNextButtonClicked(); handleNextButtonClicked();
} }
}); });
mPagerTabStrip = (PagerTabStrip) findViewById(R.id.charts_pagerTabStrip);
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.charts_main_layout);
} }
private String formatDetailedDuration() { private String formatDetailedDuration() {
@ -215,7 +248,7 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.charts_fetch_activity_data: case R.id.charts_fetch_activity_data:
GBApplication.deviceService().onFetchActivityData(); fetchActivityData();
return true; return true;
default: default:
break; break;
@ -224,6 +257,19 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
private void enableSwipeRefresh(boolean enable) {
swipeLayout.setEnabled(enable);
}
private void fetchActivityData() {
if (getDevice().isInitialized()) {
GBApplication.deviceService().onFetchActivityData();
} else {
swipeLayout.setRefreshing(false);
GB.toast(this, getString(R.string.device_not_connected), Toast.LENGTH_SHORT, GB.ERROR);
}
}
@Override @Override
public void setDateInfo(String dateInfo) { public void setDateInfo(String dateInfo) {
mDateControl.setText(dateInfo); mDateControl.setText(dateInfo);
@ -239,11 +285,12 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
return dateBar; return dateBar;
} }
/** /**
* A {@link FragmentStatePagerAdapter} that returns a fragment corresponding to * A {@link FragmentStatePagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages. * one of the sections/tabs/pages.
*/ */
public static class SectionsPagerAdapter extends AbstractFragmentPagerAdapter { public class SectionsPagerAdapter extends AbstractFragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) { public SectionsPagerAdapter(FragmentManager fm) {
super(fm); super(fm);
@ -271,5 +318,20 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
// Show 3 total pages. // Show 3 total pages.
return 4; return 4;
} }
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.activity_sleepchart_activity_and_sleep);
case 1:
return getString(R.string.sleepchart_your_sleep);
case 2:
return getString(R.string.weekstepschart_steps_a_week);
case 3:
return getString(R.string.liveactivity_live_activity);
}
return super.getPageTitle(position);
}
} }
} }

View File

@ -1,15 +1,20 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:id="@+id/activity_swipe_layout"
android:layout_height="match_parent" tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity"
android:paddingLeft="0px" android:paddingLeft="0px"
android:paddingRight="0px" android:paddingRight="0px"
android:paddingTop="0px" android:paddingTop="0px"
android:paddingBottom="0px" android:paddingBottom="0px"
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity"> android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/charts_main_layout"
android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:animateLayoutChanges="true"
android:id="@+id/charts_date_bar" android:id="@+id/charts_date_bar"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -27,14 +32,6 @@
android:text="Today" android:text="Today"
/> />
<ProgressBar
android:id="@+id/charts_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone"
/>
<Button <Button
android:id="@+id/charts_next" android:id="@+id/charts_next"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -43,9 +40,17 @@
</LinearLayout> </LinearLayout>
<android.support.v4.view.ViewPager android:id="@+id/pager" <android.support.v4.view.ViewPager android:id="@+id/charts_pager"
android:layout_width="match_parent" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity" /> tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity">
<android.support.v4.view.PagerTabStrip
android:id="@+id/charts_pagerTabStrip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
</android.support.v4.view.ViewPager>
</LinearLayout> </LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>

View File

@ -206,4 +206,5 @@
<string name="abstract_chart_fragment_kind_light_sleep">Light Sleep</string> <string name="abstract_chart_fragment_kind_light_sleep">Light Sleep</string>
<string name="abstract_chart_fragment_kind_deep_sleep">Deep Sleep</string> <string name="abstract_chart_fragment_kind_deep_sleep">Deep Sleep</string>
<string name="abstract_chart_fragment_kind_not_worn">Not Worn</string> <string name="abstract_chart_fragment_kind_not_worn">Not Worn</string>
<string name="device_not_connected">Not connected.</string>
</resources> </resources>