diff --git a/Chan/AndroidManifest.xml b/Chan/AndroidManifest.xml
index 935eafa5..2c7fbbdc 100644
--- a/Chan/AndroidManifest.xml
+++ b/Chan/AndroidManifest.xml
@@ -53,6 +53,14 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.activity.BoardActivity" />
+
+
+
+
\ No newline at end of file
diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml
index b2144f34..f01974a4 100644
--- a/Chan/res/values/strings.xml
+++ b/Chan/res/values/strings.xml
@@ -88,6 +88,8 @@
Error deleting post
Only delete the image
+ Thread watcher
+
General
Ask before opening links
Default name
@@ -100,4 +102,10 @@
Open link?
+ Off
+ Watching pinned threads
+
+ To view the thread watcher options, turn the thread watcher on.
+
+
diff --git a/Chan/res/xml/preference.xml b/Chan/res/xml/preference.xml
index 63b7699c..7f899874 100644
--- a/Chan/res/xml/preference.xml
+++ b/Chan/res/xml/preference.xml
@@ -1,57 +1,52 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+ android:key="about_licences"
+ android:summary="@string/preference_licences_summary"
+ android:title="@string/preference_licenses" />
-
+ android:key="about_version"
+ android:title="Chan" />
+ android:key="about_developer"
+ android:title="@string/preference_developer" >
+ android:action="android.intent.action.VIEW"
+ android:targetClass="org.floens.chan.activity.DeveloperActivity"
+ android:targetPackage="org.floens.chan" />
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java
index c4da0ed0..643545d9 100644
--- a/Chan/src/org/floens/chan/ChanApplication.java
+++ b/Chan/src/org/floens/chan/ChanApplication.java
@@ -8,7 +8,6 @@ import org.floens.chan.service.PinnedService;
import org.floens.chan.utils.IconCache;
import android.app.Application;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.os.StrictMode;
import android.preference.PreferenceManager;
@@ -72,7 +71,7 @@ public class ChanApplication extends Application {
new PinnedManager(this);
new ReplyManager(this);
- startService(new Intent(this, PinnedService.class));
+ PinnedService.startStopAccordingToSettings(this);
}
}
diff --git a/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java b/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java
new file mode 100644
index 00000000..6776696e
--- /dev/null
+++ b/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java
@@ -0,0 +1,108 @@
+package org.floens.chan.activity;
+
+import org.floens.chan.R;
+import org.floens.chan.utils.ChanPreferences;
+import org.floens.chan.utils.Utils;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.preference.PreferenceFragment;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.LinearLayout;
+import android.widget.Switch;
+import android.widget.TextView;
+
+public class WatchSettingsActivity extends Activity implements OnCheckedChangeListener {
+ private Switch watchSwitch;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.watch_settings, menu);
+
+ watchSwitch = (Switch) menu.findItem(R.id.enable_watch_switch).getActionView();
+ watchSwitch.setOnCheckedChangeListener(this);
+ watchSwitch.setPadding(0, 0, Utils.dp(this, 20), 0);
+
+ setEnabled(ChanPreferences.getWatchEnabled());
+
+ return true;
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ setEnabled(isChecked);
+ }
+
+ private void setEnabled(boolean enabled) {
+ if (enabled) {
+ FragmentTransaction t = getFragmentManager().beginTransaction();
+ t.replace(android.R.id.content, new WatchSettingsFragment());
+ t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
+ t.commit();
+ } else {
+ FragmentTransaction t = getFragmentManager().beginTransaction();
+ t.replace(android.R.id.content, TextFragment.newInstance(R.string.watch_info_text));
+ t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
+ t.commit();
+ }
+
+ watchSwitch.setChecked(enabled);
+
+ ChanPreferences.setWatchEnabled(enabled);
+
+ watchSwitch.setEnabled(false);
+ new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ watchSwitch.setEnabled(true);
+ }
+ }, 500);
+ }
+
+ public static class TextFragment extends Fragment {
+ public static TextFragment newInstance(int textResource) {
+ TextFragment f = new TextFragment();
+ Bundle bundle = new Bundle();
+ bundle.putInt("text_resource", textResource);
+ f.setArguments(bundle);
+ return f;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstanceState) {
+ LinearLayout container = new LinearLayout(inflater.getContext());
+
+ int p = Utils.dp(inflater.getContext(), 20);
+ container.setPadding(p, p, p, p);
+
+ TextView text = new TextView(inflater.getContext());
+ text.setTextSize(20);
+ text.setText(getArguments().getInt("text_resource"));
+
+ container.setGravity(Gravity.CENTER);
+ container.addView(text);
+
+ return container;
+ }
+ }
+
+ public static class WatchSettingsFragment extends PreferenceFragment {
+
+ }
+
+}
diff --git a/Chan/src/org/floens/chan/fragment/SettingsFragment.java b/Chan/src/org/floens/chan/fragment/SettingsFragment.java
index acbf81ac..9d337c25 100644
--- a/Chan/src/org/floens/chan/fragment/SettingsFragment.java
+++ b/Chan/src/org/floens/chan/fragment/SettingsFragment.java
@@ -15,27 +15,27 @@ import android.widget.Toast;
public class SettingsFragment extends PreferenceFragment {
private int clickCount = 0;
-
+
private Preference developerPreference;
-
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+
addPreferencesFromResource(R.xml.preference);
-
+
Preference aboutLicences = findPreference("about_licences");
if (aboutLicences != null) {
aboutLicences.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(getActivity(), AboutActivity.class));
-
+
return true;
}
});
}
-
+
Preference aboutVersion = findPreference("about_version");
if (aboutVersion != null) {
aboutVersion.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@@ -43,35 +43,45 @@ public class SettingsFragment extends PreferenceFragment {
public boolean onPreferenceClick(Preference preference) {
if (++clickCount >= 5) {
clickCount = 0;
-
+
boolean enabled = !ChanPreferences.getDeveloper();
ChanPreferences.setDeveloper(enabled);
updateDeveloperPreference();
-
- Toast.makeText(getActivity(),
+
+ Toast.makeText(getActivity(),
(enabled ? "Enabled " : "Disabled ") + "developer options", Toast.LENGTH_LONG).show();
}
-
+
return true;
}
});
-
+
String version = "";
try {
version = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0).versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
-
+
aboutVersion.setTitle(R.string.app_name);
aboutVersion.setSummary(version);
}
-
+
developerPreference = findPreference("about_developer");
((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference);
updateDeveloperPreference();
}
-
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ final Preference watchPreference = findPreference("watch_settings");
+ if (watchPreference != null) {
+ watchPreference.setSummary(ChanPreferences.getWatchEnabled() ? R.string.watch_summary_enabled : R.string.watch_summary_disabled);
+ }
+ }
+
private void updateDeveloperPreference() {
if (ChanPreferences.getDeveloper()) {
((PreferenceGroup) findPreference("group_about")).addPreference(developerPreference);
diff --git a/Chan/src/org/floens/chan/loader/Loader.java b/Chan/src/org/floens/chan/loader/Loader.java
index 61cc59aa..87e237eb 100644
--- a/Chan/src/org/floens/chan/loader/Loader.java
+++ b/Chan/src/org/floens/chan/loader/Loader.java
@@ -200,8 +200,6 @@ public class Loader {
private void onData(List result) {
if (destroyed) return;
- Logger.test("ondata in loader");
-
postsById.clear();
for (Post post : result) {
postsById.append(post.no, post);
diff --git a/Chan/src/org/floens/chan/manager/ThreadManager.java b/Chan/src/org/floens/chan/manager/ThreadManager.java
index 212ec13b..8905d872 100644
--- a/Chan/src/org/floens/chan/manager/ThreadManager.java
+++ b/Chan/src/org/floens/chan/manager/ThreadManager.java
@@ -38,10 +38,9 @@ import android.widget.Toast;
import com.android.volley.VolleyError;
/**
- * All PostView's need to have this referenced.
- * This manages some things like pages, starting and stopping of loading,
- * handling linkables, replies popups etc.
- * onDestroy, onStart and onStop must be called from the activity/fragment
+ * All PostView's need to have this referenced. This manages some things like
+ * pages, starting and stopping of loading, handling linkables, replies popups
+ * etc. onDestroy, onStart and onStop must be called from the activity/fragment
*/
public class ThreadManager implements Loader.LoaderListener {
private static final String TAG = "ThreadManager";
@@ -54,8 +53,8 @@ public class ThreadManager implements Loader.LoaderListener {
private Loader loader;
- public ThreadManager(Activity context, final ThreadManagerListener listener) {
- activity = context;
+ public ThreadManager(Activity activity, final ThreadManagerListener listener) {
+ this.activity = activity;
threadManagerListener = listener;
}
@@ -137,12 +136,14 @@ public class ThreadManager implements Loader.LoaderListener {
}
public Post findPostById(int id) {
- if (loader == null) return null;
+ if (loader == null)
+ return null;
return loader.findPostById(id);
}
public Loadable getLoadable() {
- if (loader == null) return null;
+ if (loader == null)
+ return null;
return loader.getLoadable();
}
@@ -178,7 +179,7 @@ public class ThreadManager implements Loader.LoaderListener {
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- switch(which) {
+ switch (which) {
case 0: // Reply
openReply(true); // todo if tablet
// Pass through
@@ -205,7 +206,8 @@ public class ThreadManager implements Loader.LoaderListener {
}
public void openReply(boolean startInActivity) {
- if (loader == null) return;
+ if (loader == null)
+ return;
if (startInActivity) {
ReplyActivity.setLoadable(loader.getLoadable());
@@ -246,7 +248,7 @@ public class ThreadManager implements Loader.LoaderListener {
text += "File: " + post.filename + " \nSize: " + post.imageWidth + "x" + post.imageHeight + "\n\n";
}
- text += "Time: " + post.date ;
+ text += "Time: " + post.date;
if (!TextUtils.isEmpty(post.id)) {
text += "\nId: " + post.id;
@@ -268,24 +270,23 @@ public class ThreadManager implements Loader.LoaderListener {
text += "\nCapcode: " + post.capcode;
}
- AlertDialog dialog = new AlertDialog.Builder(activity)
- .setTitle(R.string.post_info)
- .setMessage(text)
- .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- })
- .create();
+ AlertDialog dialog = new AlertDialog.Builder(activity).setTitle(R.string.post_info).setMessage(text)
+ .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ }).create();
dialog.show();
}
/**
- * When the user clicks a post:
- * a. when there's one linkable, open the linkable.
- * b. when there's more than one linkable, show the user multiple options to select from.
- * @param post The post that was clicked.
+ * When the user clicks a post: a. when there's one linkable, open the
+ * linkable. b. when there's more than one linkable, show the user multiple
+ * options to select from.
+ *
+ * @param post
+ * The post that was clicked.
*/
public void showPostLinkables(Post post) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
@@ -329,7 +330,9 @@ public class ThreadManager implements Loader.LoaderListener {
/**
* Handle when a linkable has been clicked.
- * @param linkable the selected linkable.
+ *
+ * @param linkable
+ * the selected linkable.
*/
private void handleLinkableSelected(final PostLinkable linkable) {
if (linkable.type == PostLinkable.Type.QUOTE) {
@@ -337,20 +340,16 @@ public class ThreadManager implements Loader.LoaderListener {
} else if (linkable.type == PostLinkable.Type.LINK) {
if (ChanPreferences.getOpenLinkConfirmation()) {
AlertDialog dialog = new AlertDialog.Builder(activity)
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- })
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- openLink(linkable);
- }
- })
- .setTitle(R.string.open_link_confirmation)
- .setMessage(linkable.value)
- .create();
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ }).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ openLink(linkable);
+ }
+ }).setTitle(R.string.open_link_confirmation).setMessage(linkable.value).create();
dialog.show();
} else {
@@ -360,9 +359,11 @@ public class ThreadManager implements Loader.LoaderListener {
}
/**
- * When a linkable to a post has been clicked,
- * show a dialog with the referenced post in it.
- * @param linkable the clicked linkable.
+ * When a linkable to a post has been clicked, show a dialog with the
+ * referenced post in it.
+ *
+ * @param linkable
+ * the clicked linkable.
*/
private void showPostReply(PostLinkable linkable) {
String value = linkable.value;
@@ -383,21 +384,24 @@ public class ThreadManager implements Loader.LoaderListener {
showPostsRepliesFragment(l);
}
}
- } catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
e.printStackTrace();
}
}
/**
* Open an url.
- * @param linkable Linkable with an url.
+ *
+ * @param linkable
+ * Linkable with an url.
*/
private void openLink(PostLinkable linkable) {
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(linkable.value)));
}
private void showPostsRepliesFragment(List list) {
- // Post popups are now queued up, more than 32 popups on top of each other makes the system crash!
+ // Post popups are now queued up, more than 32 popups on top of each
+ // other makes the system crash!
popupQueue.add(list);
if (currentPopupFragment != null) {
@@ -414,7 +418,8 @@ public class ThreadManager implements Loader.LoaderListener {
}
public void onPostRepliesPop() {
- if (popupQueue.size() == 0) return;
+ if (popupQueue.size() == 0)
+ return;
popupQueue.remove(popupQueue.size() - 1);
@@ -442,30 +447,26 @@ public class ThreadManager implements Loader.LoaderListener {
int padding = activity.getResources().getDimensionPixelSize(R.dimen.general_padding);
view.setPadding(padding, padding, padding, padding);
- new AlertDialog.Builder(activity)
- .setTitle(R.string.delete_confirm)
- .setView(view)
- .setPositiveButton(R.string.delete, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- doDeletePost(post, view.isChecked());
- }
- })
- .setNegativeButton(R.string.cancel, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- })
- .show();
+ new AlertDialog.Builder(activity).setTitle(R.string.delete_confirm).setView(view)
+ .setPositiveButton(R.string.delete, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ doDeletePost(post, view.isChecked());
+ }
+ }).setNegativeButton(R.string.cancel, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ }).show();
}
private void doDeletePost(Post post, boolean onlyImageDelete) {
SavedReply reply = DatabaseManager.getInstance().getSavedReply(post.board, post.no);
if (reply == null) {
- /*reply = new SavedReply();
- reply.board = "g";
- reply.no = 1234;
- reply.password = "boom";*/
+ /*
+ * reply = new SavedReply(); reply.board = "g"; reply.no = 1234;
+ * reply.password = "boom";
+ */
return;
}
@@ -501,9 +502,13 @@ public class ThreadManager implements Loader.LoaderListener {
public interface ThreadManagerListener {
public void onThreadLoaded(List result, boolean append);
+
public void onThreadLoadError(VolleyError error);
+
public void onOPClicked(Post post);
+
public void onThumbnailClicked(Post post);
+
public void onScrollTo(Post post);
}
}
diff --git a/Chan/src/org/floens/chan/service/PinnedService.java b/Chan/src/org/floens/chan/service/PinnedService.java
index 9ab02d81..120e89ec 100644
--- a/Chan/src/org/floens/chan/service/PinnedService.java
+++ b/Chan/src/org/floens/chan/service/PinnedService.java
@@ -4,19 +4,23 @@ import java.util.List;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
+import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.utils.Logger;
import org.floens.chan.watch.WatchNotifier;
import android.app.Service;
+import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
+import android.widget.Toast;
public class PinnedService extends Service {
private static final long FOREGROUND_INTERVAL = 10000L;
private static final long BACKGROUND_INTERVAL = 60000L;
+ private static PinnedService instance;
private static boolean activityInForeground = false;
private Thread loadThread;
@@ -33,6 +37,43 @@ public class PinnedService extends Service {
activityInForeground = false;
}
+ public static void startStopAccordingToSettings(Context context) {
+ if (ChanPreferences.getWatchEnabled()) {
+ if (!getRunning()) {
+ enable(context);
+ }
+ } else {
+ if (getRunning()) {
+ disable(context);
+ }
+ }
+ }
+
+ public static void enable(Context context) {
+ if (!getRunning()) {
+ context.startService(new Intent(context, PinnedService.class));
+ }
+ }
+
+ public static void disable(Context context) {
+ if (getRunning()) {
+ context.stopService(new Intent(context, PinnedService.class));
+ }
+ }
+
+ public static boolean getRunning() {
+ return instance != null;
+ }
+
+ public static void callOnPinsChanged() {
+ new Handler(Looper.getMainLooper()).post(new Runnable() {
+ @Override
+ public void run() {
+ PinnedManager.getInstance().onPinsChanged();
+ }
+ });
+ }
+
public PinnedService() {
watchNotifier = new WatchNotifier(this);
}
@@ -41,17 +82,25 @@ public class PinnedService extends Service {
public void onCreate() {
super.onCreate();
- start();
+ instance = this;
+
+ startThread();
}
@Override
public void onDestroy() {
super.onDestroy();
+ instance = null;
+
running = false;
+ if (loadThread != null) {
+ loadThread.interrupt();
+ Toast.makeText(getApplicationContext(), "Service thread interrupted", Toast.LENGTH_SHORT).show();
+ }
}
- private void start() {
+ private void startThread() {
running = true;
if (loadThread == null) {
@@ -63,18 +112,19 @@ public class PinnedService extends Service {
long timeout = activityInForeground ? FOREGROUND_INTERVAL : BACKGROUND_INTERVAL;
+ if (!running) return;
+
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
- e.printStackTrace();
+ return;
}
}
-
- loadThread = null;
}
});
loadThread.start();
+ Toast.makeText(getApplicationContext(), "Service thread started", Toast.LENGTH_SHORT).show();
}
}
@@ -87,16 +137,6 @@ public class PinnedService extends Service {
watchNotifier.update();
}
- public static void callOnPinsChanged() {
- new Handler(Looper.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- PinnedManager.getInstance().onPinsChanged();
- }
- });
- }
-
-
@Override
public IBinder onBind(Intent intent) {
return null;
diff --git a/Chan/src/org/floens/chan/utils/ChanPreferences.java b/Chan/src/org/floens/chan/utils/ChanPreferences.java
index 46ab40b5..7a64c76a 100644
--- a/Chan/src/org/floens/chan/utils/ChanPreferences.java
+++ b/Chan/src/org/floens/chan/utils/ChanPreferences.java
@@ -1,29 +1,47 @@
package org.floens.chan.utils;
import org.floens.chan.ChanApplication;
+import org.floens.chan.service.PinnedService;
public class ChanPreferences {
public static boolean getOpenLinkConfirmation() {
return ChanApplication.getPreferences().getBoolean("preference_open_link_confirmation", true);
}
-
+
public static String getDefaultName() {
return ChanApplication.getPreferences().getString("preference_default_name", "");
}
-
+
public static String getDefaultEmail() {
return ChanApplication.getPreferences().getString("preference_default_email", "");
}
-
+
public static boolean getDeveloper() {
return ChanApplication.getPreferences().getBoolean("preference_developer", false);
}
-
+
public static void setDeveloper(boolean developer) {
ChanApplication.getPreferences().edit().putBoolean("preference_developer", developer).commit();
}
-
+
public static String getImageSaveDirectory() {
return "Chan";
}
+
+ public static boolean getWatchEnabled() {
+ return ChanApplication.getPreferences().getBoolean("preference_watch_enabled", true);
+ }
+
+ /**
+ * This also calls startStopAccordingToSettings on the PinnedService to
+ * start/stop the service as needed.
+ *
+ * @param enabled
+ */
+ public static void setWatchEnabled(boolean enabled) {
+ if (getWatchEnabled() != enabled) {
+ ChanApplication.getPreferences().edit().putBoolean("preference_watch_enabled", enabled).commit();
+ PinnedService.startStopAccordingToSettings(ChanApplication.getInstance());
+ }
+ }
}
diff --git a/Chan/src/org/floens/chan/utils/ScrollerRunnable.java b/Chan/src/org/floens/chan/utils/ScrollerRunnable.java
index 8d893b80..16eecc18 100644
--- a/Chan/src/org/floens/chan/utils/ScrollerRunnable.java
+++ b/Chan/src/org/floens/chan/utils/ScrollerRunnable.java
@@ -5,8 +5,6 @@ import android.view.ViewConfiguration;
import android.widget.ListView;
public class ScrollerRunnable implements Runnable {
- private static final int SCROLL_DURATION = 1;
-
private static final int MOVE_DOWN_POS = 1;
private static final int MOVE_UP_POS = 2;
@@ -28,12 +26,12 @@ public class ScrollerRunnable implements Runnable {
final int firstPos = mList.getFirstVisiblePosition();
final int lastPos = firstPos + mList.getChildCount() - 1;
- int viewTravelCount = 0;
+// int viewTravelCount = 0;
if (position <= firstPos) {
- viewTravelCount = firstPos - position + 1;
+// viewTravelCount = firstPos - position + 1;
mMode = MOVE_UP_POS;
} else if (position >= lastPos) {
- viewTravelCount = position - lastPos + 1;
+// viewTravelCount = position - lastPos + 1;
mMode = MOVE_DOWN_POS;
} else {
// Already on screen, nothing to do
diff --git a/Chan/src/org/floens/chan/utils/Utils.java b/Chan/src/org/floens/chan/utils/Utils.java
index 06007256..77be1153 100644
--- a/Chan/src/org/floens/chan/utils/Utils.java
+++ b/Chan/src/org/floens/chan/utils/Utils.java
@@ -5,9 +5,14 @@ import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
+import android.util.TypedValue;
import android.view.View;
public class Utils {
+ public static int dp(Context context, int dp) {
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, context.getResources().getDisplayMetrics());
+ }
+
/**
* Sets the android.R.attr.selectableItemBackground as background drawable on the view.
* @param view
diff --git a/Chan/src/org/floens/chan/watch/WatchNotifier.java b/Chan/src/org/floens/chan/watch/WatchNotifier.java
index d87b0b51..6b5f5fdf 100644
--- a/Chan/src/org/floens/chan/watch/WatchNotifier.java
+++ b/Chan/src/org/floens/chan/watch/WatchNotifier.java
@@ -1,6 +1,10 @@
package org.floens.chan.watch;
+import java.util.List;
+
import org.floens.chan.R;
+import org.floens.chan.manager.PinnedManager;
+import org.floens.chan.model.Pin;
import android.app.Notification;
import android.app.NotificationManager;
@@ -16,7 +20,18 @@ public class WatchNotifier {
}
public void update() {
- showNotification("Update!");
+ List pins = PinnedManager.getInstance().getPins();
+
+ int count = 0;
+ int pinCount = 0;
+
+ for (Pin pin : pins) {
+ count += pin.getNewPostCount();
+ pinCount++;
+ }
+
+ showNotification(count + " new posts in " + pinCount + " threads");
+// showNotification("WatchNotifier update");
}
private void showNotification(String text) {
@@ -27,6 +42,7 @@ public class WatchNotifier {
builder.setContentTitle(text);
builder.setContentText(text);
builder.setSmallIcon(R.drawable.ic_stat_notify);
+ builder.setOnlyAlertOnce(false);
nm.notify(NOTIFICATION_ID, builder.getNotification());
}