Add countdown and progressdialog to pins

captchafix
Florens Douwes 11 years ago
parent f9dc5e2cce
commit 7d45a8380f
  1. 6
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  2. 8
      Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java
  3. 70
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java
  4. 58
      Clover/app/src/main/res/layout/pin_item.xml
  5. 16
      Clover/app/src/main/res/layout/pin_item_header.xml

@ -40,7 +40,7 @@ import java.util.concurrent.TimeUnit;
public class WatchManager implements ChanApplication.ForegroundChangedListener { public class WatchManager implements ChanApplication.ForegroundChangedListener {
private static final String TAG = "WatchManager"; private static final String TAG = "WatchManager";
private static final int FOREGROUND_TIME = 10; private static final int FOREGROUND_TIME = 5;
private final Context context; private final Context context;
private final List<PinListener> listeners = new ArrayList<>(); private final List<PinListener> listeners = new ArrayList<>();
@ -312,11 +312,11 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
} }
}, time, TimeUnit.SECONDS); }, time, TimeUnit.SECONDS);
pendingTimer = new PendingTimer(scheduledFuture, time); pendingTimer = new PendingTimer(scheduledFuture, time);
Logger.d(TAG, "Timer firing in " + time + " seconds"); // Logger.d(TAG, "Timer firing in " + time + " seconds");
} }
private void timerFired() { private void timerFired() {
Logger.d(TAG, "Timer fired"); // Logger.d(TAG, "Timer fired");
pendingTimer = null; pendingTimer = null;
for (Pin pin : getWatchingPins()) { for (Pin pin : getWatchingPins()) {

@ -104,6 +104,14 @@ public class PinWatcher implements Loader.LoaderListener {
} }
} }
public long getTimeUntilNextLoad() {
return loader.getTimeUntilLoadMore();
}
public boolean isLoading() {
return loader.isLoading();
}
@Override @Override
public void onError(VolleyError error) { public void onError(VolleyError error) {
Logger.e(TAG, "PinWatcher onError: ", error); Logger.e(TAG, "PinWatcher onError: ", error);

@ -18,12 +18,15 @@
package org.floens.chan.ui.adapter; package org.floens.chan.ui.adapter;
import android.content.Context; import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
@ -40,6 +43,7 @@ public class PinnedAdapter extends BaseAdapter {
private Context context; private Context context;
private List<Pin> pins = new ArrayList<>(); private List<Pin> pins = new ArrayList<>();
private boolean postInvalidated = false;
public PinnedAdapter(Context context) { public PinnedAdapter(Context context) {
this.context = context; this.context = context;
@ -109,26 +113,54 @@ public class PinnedAdapter extends BaseAdapter {
convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null); convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item, null);
} }
((TextView) convertView.findViewById(R.id.drawer_item_text)).setText(item.loadable.title); ((TextView) convertView.findViewById(R.id.pin_text)).setText(item.loadable.title);
FrameLayout frameLayout = (FrameLayout) convertView.findViewById(R.id.drawer_item_count_container); FrameLayout timeContainer = (FrameLayout) convertView.findViewById(R.id.pin_time_container);
FrameLayout countContainer = (FrameLayout) convertView.findViewById(R.id.pin_count_container);
if (ChanPreferences.getWatchEnabled()) { if (ChanPreferences.getWatchEnabled()) {
frameLayout.setVisibility(View.VISIBLE); countContainer.setVisibility(View.VISIBLE);
TextView itemCount = (TextView) convertView.findViewById(R.id.drawer_item_count); TextView timeView = (TextView) convertView.findViewById(R.id.pin_time);
if (item.watching && item.getPinWatcher() != null) {
timeContainer.setVisibility(View.VISIBLE);
long timeRaw = item.getPinWatcher().getTimeUntilNextLoad();
long time = 0;
if (timeRaw > 0) {
time = timeRaw / 1000L;
time = Math.min(9999, time);
}
timeView.setText(Long.toString(time));
postInvalidate();
} else {
timeContainer.setVisibility(View.GONE);
}
TextView countView = (TextView) convertView.findViewById(R.id.pin_count);
ProgressBar loadView = (ProgressBar) convertView.findViewById(R.id.pin_load);
if (item.isError) { if (item.isError) {
itemCount.setText("Err"); countView.setText("Err");
} else { } else {
int count = item.getNewPostsCount(); int count = item.getNewPostsCount();
String total = Integer.toString(count); String total = Integer.toString(count);
if (count > 999) { if (count > 999) {
total = "1k+"; total = "1k+";
} }
itemCount.setText(total); countView.setText(total);
} }
itemCount.setOnClickListener(new View.OnClickListener() { if (item.getPinWatcher() != null && item.getPinWatcher().isLoading()) {
countView.setVisibility(View.GONE);
loadView.setVisibility(View.VISIBLE);
} else {
loadView.setVisibility(View.GONE);
countView.setVisibility(View.VISIBLE);
}
countView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
item.toggleWatch(); item.toggleWatch();
@ -136,14 +168,15 @@ public class PinnedAdapter extends BaseAdapter {
}); });
if (!item.watching) { if (!item.watching) {
frameLayout.setBackgroundResource(R.drawable.pin_icon_gray); countContainer.setBackgroundResource(R.drawable.pin_icon_gray);
} else if (item.getNewQuoteCount() > 0) { } else if (item.getNewQuoteCount() > 0) {
frameLayout.setBackgroundResource(R.drawable.pin_icon_red); countContainer.setBackgroundResource(R.drawable.pin_icon_red);
} else { } else {
frameLayout.setBackgroundResource(R.drawable.pin_icon_blue); countContainer.setBackgroundResource(R.drawable.pin_icon_blue);
} }
} else { } else {
frameLayout.setVisibility(View.GONE); timeContainer.setVisibility(View.GONE);
countContainer.setVisibility(View.GONE);
} }
return convertView; return convertView;
@ -151,7 +184,7 @@ public class PinnedAdapter extends BaseAdapter {
case VIEW_TYPE_HEADER: { case VIEW_TYPE_HEADER: {
if (convertView == null) { if (convertView == null) {
convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item_header, null); convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.pin_item_header, null);
((TextView) convertView.findViewById(R.id.drawer_item_header)).setText(R.string.drawer_pinned); ((TextView) convertView.findViewById(R.id.pin_header)).setText(R.string.drawer_pinned);
} }
return convertView; return convertView;
@ -167,4 +200,17 @@ public class PinnedAdapter extends BaseAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
private void postInvalidate() {
if (!postInvalidated) {
postInvalidated = true;
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
postInvalidated = false;
notifyDataSetInvalidated();
}
}, 1000);
}
}
} }

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
Clover - 4chan browser https://github.com/Floens/Clover/ Clover - 4chan browser https://github.com/Floens/Clover/
Copyright (C) 2014 Floens Copyright (C) 2014 Floens
@ -16,42 +15,63 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
android:id="@+id/drawer_item_text" android:id="@+id/pin_text"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_weight="1" android:layout_weight="1"
android:paddingTop="8dp" android:ellipsize="end"
android:gravity="center_vertical"
android:lines="1"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="8dp" android:paddingRight="0dp"
android:textSize="19sp" android:paddingTop="8dp"
android:singleLine="true"
android:textColor="#fff" android:textColor="#fff"
android:gravity="center_vertical" android:textSize="19sp" />
android:ellipsize="end"
android:lines="1" <FrameLayout
android:singleLine="true"> android:id="@+id/pin_time_container"
</TextView> android:layout_width="wrap_content"
android:layout_height="48dp"
android:paddingLeft="4dp">
<TextView
android:id="@+id/pin_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:lines="1"
android:minWidth="36dp"
android:textColor="#fff"
android:textSize="16dp" />
</FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/drawer_item_count_container" android:id="@+id/pin_count_container"
android:background="@drawable/pin_icon_blue"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp"> android:layout_height="48dp"
android:background="@drawable/pin_icon_blue">
<TextView <TextView
android:id="@+id/drawer_item_count" android:id="@+id/pin_count"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:textSize="16dp" android:textColor="#fff"
android:textColor="#fff"/> android:textSize="16dp" />
<ProgressBar
android:id="@+id/pin_load"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout> </FrameLayout>

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
Clover - 4chan browser https://github.com/Floens/Clover/ Clover - 4chan browser https://github.com/Floens/Clover/
Copyright (C) 2014 Floens Copyright (C) 2014 Floens
@ -16,19 +15,18 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/drawer_item_header" android:id="@+id/pin_header"
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="24dp" android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="56dp" android:paddingRight="56dp"
android:paddingBottom="8dp" android:paddingTop="24dp" />
style="?android:attr/listSeparatorTextViewStyle"
android:orientation="vertical"/>
</LinearLayout> </LinearLayout>

Loading…
Cancel
Save