Pins are now stored in the db.

captchafix
Florens Douwes 12 years ago
parent 373f7f5e17
commit 8ddb486999
  1. 23
      Chan/src/org/floens/chan/ChanApplication.java
  2. 176
      Chan/src/org/floens/chan/activity/BaseActivity.java
  3. 80
      Chan/src/org/floens/chan/activity/BoardActivity.java
  4. 8
      Chan/src/org/floens/chan/activity/BoardEditor.java
  5. 4
      Chan/src/org/floens/chan/activity/CatalogActivity.java
  6. 28
      Chan/src/org/floens/chan/adapter/PinnedAdapter.java
  7. 19
      Chan/src/org/floens/chan/database/DatabaseHelper.java
  8. 23
      Chan/src/org/floens/chan/database/DatabaseManager.java
  9. 8
      Chan/src/org/floens/chan/manager/BoardManager.java
  10. 112
      Chan/src/org/floens/chan/manager/PinnedManager.java
  11. 69
      Chan/src/org/floens/chan/utils/Logger.java

@ -17,13 +17,11 @@ import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class ChanApplication extends Application {
public static final boolean DEVELOPER_MODE = false;
public static final boolean DEVELOPER_MODE = true;
private static ChanApplication instance;
private static RequestQueue volleyRequestQueue;
private static ImageLoader imageLoader;
private static BoardManager boardManager;
private static PinnedManager pinnedManager;
private static DatabaseManager databaseManager;
public ChanApplication() {
@ -42,18 +40,6 @@ public class ChanApplication extends Application {
return imageLoader;
}
public static BoardManager getBoardManager() {
return boardManager;
}
public static PinnedManager getPinnedManager() {
return pinnedManager;
}
public static DatabaseManager getDatabaseManager() {
return databaseManager;
}
public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(instance);
}
@ -86,10 +72,11 @@ public class ChanApplication extends Application {
volleyRequestQueue = Volley.newRequestQueue(this);
imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(1024 * 1024 * 8));
boardManager = new BoardManager(this);
pinnedManager = new PinnedManager(this);
new DatabaseManager(this);
new BoardManager(this);
new PinnedManager(this);
new ReplyManager(this);
databaseManager = new DatabaseManager(this);
}
}

@ -1,10 +1,10 @@
package org.floens.chan.activity;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.adapter.PinnedAdapter;
import org.floens.chan.animation.SwipeDismissListViewTouchListener;
import org.floens.chan.animation.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
@ -44,17 +44,20 @@ import android.widget.ShareActionProvider;
public abstract class BaseActivity extends Activity implements PanelSlideListener {
private final static int ACTION_OPEN_URL = 1;
protected DrawerLayout drawer;
protected ListView drawerList;
protected ActionBarDrawerToggle drawerListener;
protected SlidingPaneLayout pane;
protected ShareActionProvider shareActionProvider;
protected PinnedAdapter pinnedAdapter;
protected DrawerLayout pinDrawer;
protected ListView pinDrawerView;
protected ActionBarDrawerToggle pinDrawerListener;
protected SlidingPaneLayout threadPane;
private ShareActionProvider shareActionProvider;
/**
* Called when a post has been clicked in the pinned drawer
* @param post
*/
abstract public void onDrawerClicked(Pin post);
abstract public void openPin(Pin post);
/**
* Called when a post has been clicked in the listview
@ -68,43 +71,39 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
setContentView(R.layout.activity_base);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
setupDrawer(drawer);
pinDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
initDrawer();
pane = (SlidingPaneLayout) findViewById(R.id.pane_container);
pane.setPanelSlideListener(this);
pane.setParallaxDistance(200);
pane.setShadowResource(R.drawable.panel_shadow);
pane.setSliderFadeColor(0xcce5e5e5);
pane.openPane();
threadPane = (SlidingPaneLayout) findViewById(R.id.pane_container);
initPane();
}
protected void setupDrawer(DrawerLayout drawer) {
if (drawerListener == null) {
protected void initDrawer() {
if (pinDrawerListener == null) {
return;
}
drawer.setDrawerListener(drawerListener);
drawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
pinDrawer.setDrawerListener(pinDrawerListener);
pinDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
drawerList = (ListView)findViewById(R.id.left_drawer);
pinDrawerView = (ListView)findViewById(R.id.left_drawer);
final PinnedAdapter adapter = ChanApplication.getPinnedManager().getAdapter();
drawerList.setAdapter(adapter);
pinnedAdapter = PinnedManager.getInstance().getAdapter();
pinDrawerView.setAdapter(pinnedAdapter);
drawerList.setOnItemClickListener(new OnItemClickListener() {
pinDrawerView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Pin post = adapter.getItem(position);
if (post == null || post.type == Pin.Type.HEADER) return;
onDrawerClicked(post);
Pin pin = pinnedAdapter.getItem(position);
if (pin == null || pin.type == Pin.Type.HEADER) return;
openPin(pin);
}
});
drawerList.setOnItemLongClickListener(new OnItemLongClickListener() {
pinDrawerView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Pin post = adapter.getItem(position);
Pin post = pinnedAdapter.getItem(position);
if (post == null || post.type == Pin.Type.HEADER) return false;
changePinTitle(post);
@ -113,26 +112,89 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
}
});
SwipeDismissListViewTouchListener touchListener = new SwipeDismissListViewTouchListener(drawerList,
SwipeDismissListViewTouchListener touchListener = new SwipeDismissListViewTouchListener(pinDrawerView,
new DismissCallbacks() {
@Override
public void onDismiss(ListView listView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
ChanApplication.getPinnedManager().remove(adapter.getItem(position));
removePin(pinnedAdapter.getItem(position));
}
}
@Override
public boolean canDismiss(int position) {
return adapter.getItem(position).type != Pin.Type.HEADER;
return pinnedAdapter.getItem(position).type != Pin.Type.HEADER;
}
});
drawerList.setOnTouchListener(touchListener);
drawerList.setOnScrollListener(touchListener.makeScrollListener());
pinDrawerView.setOnTouchListener(touchListener);
pinDrawerView.setOnScrollListener(touchListener.makeScrollListener());
}
@Override
private void initPane() {
threadPane.setPanelSlideListener(this);
threadPane.setParallaxDistance(200);
threadPane.setShadowResource(R.drawable.panel_shadow);
threadPane.setSliderFadeColor(0xcce5e5e5);
threadPane.openPane();
}
public void addPin(Pin pin) {
PinnedManager.getInstance().add(pin);
pinnedAdapter.add(pin);
}
public void removePin(Pin pin) {
PinnedManager.getInstance().remove(pin);
pinnedAdapter.remove(pin);
}
public void updatePin(Pin pin) {
PinnedManager.getInstance().update(pin);
pinnedAdapter.notifyDataSetChanged();
}
private void changePinTitle(final Pin pin) {
final EditText text = new EditText(this);
text.setSingleLine();
text.setText(pin.loadable.title);
text.setSelectAllOnFocus(true);
AlertDialog dialog = new AlertDialog.Builder(this)
.setPositiveButton(R.string.change, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
String value = text.getText().toString();
if (!TextUtils.isEmpty(value)) {
pin.loadable.title = value;
updatePin(pin);
}
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
}
})
.setTitle(R.string.drawer_pinned_change_title)
.setView(text)
.create();
text.requestFocus();
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(text, 0);
}
});
dialog.show();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.action_settings:
@ -146,6 +208,8 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.base, menu);
shareActionProvider = (ShareActionProvider) menu.findItem(R.id.action_share).getActionProvider();
return true;
}
@ -194,7 +258,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
* This is done to prevent "open in browser" opening the url in our own app.
* @param url
*/
public void openUrl(String url) {
public void showUrlOpenPicker(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
@ -204,7 +268,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
}
/**
* Used for openUrl
* Used for showUrlOpenPicker
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
@ -215,46 +279,6 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
startActivity(data);
}
}
private void changePinTitle(final Pin pin) {
final EditText text = new EditText(this);
text.setSingleLine();
text.setText(pin.loadable.title);
text.setSelectAllOnFocus(true);
AlertDialog dialog = new AlertDialog.Builder(this)
.setPositiveButton(R.string.change, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
String value = text.getText().toString();
if (!TextUtils.isEmpty(value)) {
pin.loadable.title = value;
ChanApplication.getPinnedManager().update(pin);
}
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
}
})
.setTitle(R.string.drawer_pinned_change_title)
.setView(text)
.create();
text.requestFocus();
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(text, 0);
}
});
dialog.show();
}
}

@ -3,10 +3,11 @@ package org.floens.chan.activity;
import java.util.ArrayList;
import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.fragment.ReplyFragment;
import org.floens.chan.fragment.ThreadFragment;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
@ -21,13 +22,11 @@ import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ShareActionProvider;
public class BoardActivity extends BaseActivity implements ActionBar.OnNavigationListener {
private Loadable boardLoadable = new Loadable();
@ -59,7 +58,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
actionBar.getThemedContext(),
R.layout.board_select_spinner,
android.R.id.text1,
ChanApplication.getBoardManager().getMyBoardsKeys()
BoardManager.getInstance().getMyBoardsKeys()
), this);
Intent startIntent = getIntent();
@ -86,16 +85,17 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
}
@Override
protected void setupDrawer(DrawerLayout drawer) {
drawerListener = new ActionBarDrawerToggle(this, drawer, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {};
protected void initDrawer() {
pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {};
super.setupDrawer(drawer);
super.initDrawer();
}
@Override
public boolean onNavigationItemSelected(int position, long id) {
if (!boardSetByIntent) {
boardLoadable = new Loadable(ChanApplication.getBoardManager().getMyBoardsValues().get(position));
boardLoadable = new Loadable(BoardManager.getInstance().getMyBoardsValues().get(position));
startLoadingBoard(boardLoadable);
}
@ -108,22 +108,20 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
shareActionProvider = (ShareActionProvider) menu.findItem(R.id.action_share).getActionProvider();
return true;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerListener.onConfigurationChanged(newConfig);
pinDrawerListener.onConfigurationChanged(newConfig);
}
@Override
public void onDrawerClicked(Pin pin) {
public void openPin(Pin pin) {
startLoadingThread(pin.loadable);
drawer.closeDrawer(drawerList);
pinDrawer.closeDrawer(pinDrawerView);
}
@Override
@ -134,37 +132,37 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerListener.syncState();
pinDrawerListener.syncState();
}
@Override
public void onBackPressed() {
if (pane.isOpen()) {
if (threadPane.isOpen()) {
super.onBackPressed();
} else {
pane.openPane();
threadPane.openPane();
}
}
private void updateActionBarState() {
final ActionBar actionBar = getActionBar();
if (pane.isSlideable()) {
if (pane.isOpen()) {
if (threadPane.isSlideable()) {
if (threadPane.isOpen()) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setHomeButtonEnabled(true);
actionBar.setTitle("");
drawerListener.setDrawerIndicatorEnabled(true);
pinDrawerListener.setDrawerIndicatorEnabled(true);
} else {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setTitle(threadLoadable.title);
drawerListener.setDrawerIndicatorEnabled(false);
pinDrawerListener.setDrawerIndicatorEnabled(false);
}
actionBar.setDisplayHomeAsUpEnabled(true);
} else {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
drawerListener.setDrawerIndicatorEnabled(true);
pinDrawerListener.setDrawerIndicatorEnabled(true);
actionBar.setTitle(threadLoadable.title);
actionBar.setDisplayHomeAsUpEnabled(false);
@ -177,7 +175,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean open = pane.isOpen();
boolean open = threadPane.isOpen();
setMenuItemEnabled(menu.findItem(R.id.action_pin), !open);
@ -193,13 +191,13 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerListener.onOptionsItemSelected(item)) {
if (pinDrawerListener.onOptionsItemSelected(item)) {
return true;
}
switch(item.getItemId()) {
case R.id.action_reload:
if (pane.isOpen()) {
if (threadPane.isOpen()) {
boardFragment.reload();
} else {
if (threadFragment.getThreadManager().hasThread()) {
@ -208,11 +206,11 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
}
return true;
case R.id.action_reply:
if (pane.isOpen()) {
startReply(pane.isSlideable(), boardLoadable);
if (threadPane.isOpen()) {
startReply(threadPane.isSlideable(), boardLoadable);
} else {
if (threadFragment.getThreadManager().hasThread()) {
startReply(pane.isSlideable(), threadLoadable);
startReply(threadPane.isSlideable(), threadLoadable);
}
}
@ -222,24 +220,24 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
Pin pin = new Pin();
pin.loadable = threadLoadable;
ChanApplication.getPinnedManager().add(pin);
addPin(pin);
drawer.openDrawer(drawerList);
pinDrawer.openDrawer(pinDrawerView);
}
return true;
case R.id.action_open_browser:
if (pane.isOpen()) {
openUrl(ChanUrls.getBoardUrlDesktop(boardLoadable.board));
if (threadPane.isOpen()) {
showUrlOpenPicker(ChanUrls.getBoardUrlDesktop(boardLoadable.board));
} else {
if (threadFragment.getThreadManager().hasThread()) {
openUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
showUrlOpenPicker(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
}
}
return true;
case android.R.id.home:
pane.openPane();
threadPane.openPane();
return true;
}
@ -278,7 +276,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
}
private void startLoadingThread(Loadable loadable) {
Pin pin = ChanApplication.getPinnedManager().findPinByLoadable(loadable);
Pin pin = PinnedManager.getInstance().findPinByLoadable(loadable);
if (pin != null) {
// Use the loadable from the pin.
// This way we can store the listview position in the pin loadable,
@ -296,7 +294,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
loadable.title = "/" + loadable.board + "/" + loadable.no;
}
pane.closePane();
threadPane.closePane();
updateActionBarState();
}
@ -312,7 +310,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
// Board mode
String rawBoard = parts.get(0);
if (ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
if (BoardManager.getInstance().getBoardExists(rawBoard)) {
boardLoadable.board = rawBoard;
boardSetByIntent = true;
startLoadingBoard(boardLoadable);
@ -321,7 +319,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
if (!setNavigationFromBoardValue(rawBoard)) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
String value = ChanApplication.getBoardManager().getBoardKey(rawBoard);
String value = BoardManager.getInstance().getBoardKey(rawBoard);
actionBar.setTitle(value == null ? ("/" + rawBoard + "/") : value);
}
@ -338,7 +336,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException e) {}
if (no >= 0 && ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
if (no >= 0 && BoardManager.getInstance().getBoardExists(rawBoard)) {
boardSetByIntent = true;
startLoadingBoard(new Loadable(rawBoard));
@ -348,7 +346,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
return;
}
} else {
openUrl(startUri.toString());
showUrlOpenPicker(startUri.toString());
}
}
@ -367,7 +365,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override
public void onClick(DialogInterface dialog, int which) {
// Ok button
openUrl(url);
showUrlOpenPicker(url);
}
})
.setCancelable(false)
@ -382,7 +380,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
* @return true if spinner was set, false otherwise
*/
private boolean setNavigationFromBoardValue(String boardValue) {
ArrayList<String> list = ChanApplication.getBoardManager().getMyBoardsValues();
ArrayList<String> list = BoardManager.getInstance().getMyBoardsValues();
int foundIndex = -1;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(boardValue)) {

@ -2,9 +2,9 @@ package org.floens.chan.activity;
import java.util.ArrayList;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.adapter.BoardEditAdapter;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.model.Board;
import org.floens.chan.view.DynamicListView;
@ -35,7 +35,7 @@ public class BoardEditor extends Activity {
setContentView(R.layout.board_edit);
// Copy not a reference
list = (ArrayList<Board>) ChanApplication.getBoardManager().getMyBoards().clone();
list = (ArrayList<Board>) BoardManager.getInstance().getMyBoards().clone();
adapter = new BoardEditAdapter(this, R.layout.board_view, list, this);
listView = (DynamicListView<Board>) findViewById(R.id.board_edit_list);
@ -51,7 +51,7 @@ public class BoardEditor extends Activity {
// For runtime changes
if (list.size() > 0) {
ChanApplication.getBoardManager().setMyBoards((ArrayList<Board>) list.clone());
BoardManager.getInstance().setMyBoards((ArrayList<Board>) list.clone());
}
}
@ -65,7 +65,7 @@ public class BoardEditor extends Activity {
}
private void addBoard(String value) {
ChanApplication.getBoardManager().addBoard(list, value);
BoardManager.getInstance().addBoard(list, value);
adapter = new BoardEditAdapter(this, R.layout.board_view, list, this);
listView.setArrayList(list);

@ -24,7 +24,7 @@ public class CatalogActivity extends BaseActivity {
}
@Override
public void onDrawerClicked(Pin post) {
public void openPin(Pin post) {
}
@ -70,7 +70,7 @@ public class CatalogActivity extends BaseActivity {
return true;
case R.id.action_open_browser:
openUrl(ChanUrls.getCatalogUrlDesktop(loadable.board));
showUrlOpenPicker(ChanUrls.getCatalogUrlDesktop(loadable.board));
return true;
case android.R.id.home:

@ -1,7 +1,7 @@
package org.floens.chan.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.floens.chan.R;
import org.floens.chan.model.Pin;
@ -15,19 +15,14 @@ import android.widget.LinearLayout;
import android.widget.TextView;
public class PinnedAdapter extends ArrayAdapter<Pin> {
private final HashMap<Pin, Integer> idMap = new HashMap<Pin, Integer>();
private final HashMap<Pin, Integer> idMap;
private int idCounter;
private View.OnTouchListener listener;
public PinnedAdapter(Context context, int resId, List<Pin> list) {
super(context, resId, list);
public PinnedAdapter(Context context, int resId) {
super(context, resId, new ArrayList<Pin>());
int i = 0;
for (i = 0; i < list.size(); ++i) {
idMap.put(list.get(i), i);
}
idCounter = i + 1;
idMap = new HashMap<Pin, Integer>();
}
public void setTouchListener(View.OnTouchListener listener) {
@ -41,6 +36,7 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
LinearLayout view = null;
Pin item = getItem(position);
if (item.type == Pin.Type.HEADER) {
view = (LinearLayout) inflater.inflate(R.layout.drawer_item_header, null);
@ -80,8 +76,18 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
@Override
public long getItemId(int position) {
if (position < 0 || position >= getCount()) return -1;
Pin item = getItem(position);
return idMap.get(item);
if (item == null) {
return -1;
} else {
Integer i = idMap.get(item);
if (i == null) {
return -1;
} else {
return i;
}
}
}
}

@ -4,6 +4,7 @@ import java.sql.SQLException;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import org.floens.chan.utils.Logger;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
@ -11,6 +12,7 @@ import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "ChanDB";
@ -32,11 +34,24 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Pin.class);
TableUtils.createTable(connectionSource, Loadable.class);
} catch (SQLException e) {
Logger.e("Error creating db", e);
throw new RuntimeException(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
switch(oldVersion) {
// Change tables if we make adjustments
}
}
}

@ -4,37 +4,49 @@ import java.sql.SQLException;
import java.util.List;
import org.floens.chan.model.Pin;
import org.floens.chan.utils.Logger;
import android.content.Context;
public class DatabaseManager {
private static DatabaseManager instance;
private final DatabaseHelper helper;
public DatabaseManager(Context context) {
instance = this;
helper = new DatabaseHelper(context);
}
public static DatabaseManager getInstance() {
return instance;
}
public void addPin(Pin pin) {
try {
helper.loadableDao.create(pin.loadable);
helper.pinDao.create(pin);
} catch (SQLException e) {
e.printStackTrace();
Logger.e("Error adding pin to db", e);
}
}
public void removePin(Pin pin) {
try {
helper.pinDao.delete(pin);
helper.loadableDao.delete(pin.loadable);
} catch (SQLException e) {
e.printStackTrace();
Logger.e("Error removing pin from db", e);
}
}
public void updatePin(Pin pin) {
try {
helper.pinDao.update(pin);
helper.loadableDao.update(pin.loadable);
} catch (SQLException e) {
e.printStackTrace();
Logger.e("Error updating pin in db", e);
}
}
@ -42,8 +54,11 @@ public class DatabaseManager {
List<Pin> list = null;
try {
list = helper.pinDao.queryForAll();
for (Pin p : list) {
helper.loadableDao.refresh(p.loadable);
}
} catch (SQLException e) {
e.printStackTrace();
Logger.e("Error getting pins from db", e);
}
return list;

@ -18,6 +18,8 @@ import com.android.volley.Response;
import com.android.volley.VolleyError;
public class BoardManager {
private static BoardManager instance;
private final Context context;
// Including nsfw ones
private ArrayList<Board> allBoards = new ArrayList<Board>();
@ -27,6 +29,8 @@ public class BoardManager {
private final ArrayList<String> myBoardsValues = new ArrayList<String>();
public BoardManager(Context context) {
instance = this;
this.context = context;
loadFromServer();
@ -34,6 +38,10 @@ public class BoardManager {
updateMyBoardsKeysAndValues(myBoards);
}
public static BoardManager getInstance() {
return instance;
}
/**
* Avoid having 0 boards, which causes graphical problems
* @param list

@ -1,35 +1,40 @@
package org.floens.chan.manager;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.adapter.PinnedAdapter;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import android.content.Context;
public class PinnedManager {
private final ArrayList<Pin> list = new ArrayList<Pin>();
private final PinnedAdapter adapter;
private static PinnedManager instance;
private final Context context;
private final List<Pin> pins;
public PinnedManager(Context context) {
adapter = new PinnedAdapter(context, 0, list);
instance = this;
this.context = context;
pins = DatabaseManager.getInstance().getPinned();
}
public static PinnedManager getInstance() {
return instance;
}
public PinnedAdapter getAdapter() {
PinnedAdapter adapter = new PinnedAdapter(context, 0);
Pin header = new Pin();
header.type = Pin.Type.HEADER;
adapter.add(header);
ArrayList<Pin> stored = getPinnedListFromPreferences("pinnedList");
if (stored != null) {
for (Pin post : stored) {
adapter.add(post);
}
}
}
public PinnedAdapter getAdapter() {
adapter.addAll(pins);
return adapter;
}
@ -39,9 +44,7 @@ public class PinnedManager {
* @return The pin whose loadable is equal to the supplied loadable, or null if no pin was found.
*/
public Pin findPinByLoadable(Loadable other) {
ArrayList<Pin> pinList = getPinnedThreads();
for (Pin pin : pinList) {
for (Pin pin : pins) {
if (pin.loadable.equals(other)) {
return pin;
}
@ -50,86 +53,25 @@ public class PinnedManager {
return null;
}
public ArrayList<Pin> getPinnedThreads() {
ArrayList<Pin> tempList = new ArrayList<Pin>();
for (Pin pin : list) {
if (pin.type == Pin.Type.THREAD) {
tempList.add(pin);
}
}
return tempList;
}
public void add(Pin pin) {
// No duplicates
for (Pin e : list) {
for (Pin e : pins) {
if (e.loadable.equals(pin.loadable)) {
return;
}
}
adapter.add(pin);
storePinnedListInPreferences("pinnedList", list);
pins.add(pin);
DatabaseManager.getInstance().addPin(pin);
}
public void remove(Pin pin) {
adapter.remove(pin);
storePinnedListInPreferences("pinnedList", list);
pins.remove(pin);
DatabaseManager.getInstance().removePin(pin);
}
public void update(Pin pin) {
adapter.notifyDataSetChanged();
storePinnedListInPreferences("pinnedList", list);
}
private void storePinnedListInPreferences(String key, ArrayList<Pin> list) {
String total = "";
for (Pin post : list) {
total += post.loadable.board + "\u1208" + post.loadable.no + "\u1208" + post.loadable.title + "\n";
}
ChanApplication.getPreferences().edit().putString(key, total).commit();
}
private ArrayList<Pin> getPinnedListFromPreferences(String key) {
String total = ChanApplication.getPreferences().getString(key, null);
if (total == null) return null;
ArrayList<Pin> list = new ArrayList<Pin>();
Scanner scanner = new Scanner(total);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] splitted = line.split("\\u1208");
if (splitted.length < 3) continue;
Pin post = new Pin();
post.loadable.board = splitted[0];
try {
post.loadable.no = Integer.parseInt(splitted[1]);
} catch(NumberFormatException e) {
e.printStackTrace();
scanner.close();
return null;
}
post.loadable.title = splitted[2];
list.add(post);
}
scanner.close();
return list;
DatabaseManager.getInstance().updatePin(pin);
}
}

@ -0,0 +1,69 @@
package org.floens.chan.utils;
import org.floens.chan.ChanApplication;
import android.util.Log;
public class Logger {
public static final String TAG = "Chan";
public static final String TAG_TEST = "ChanTest";
public static void v(String message) {
Log.v(TAG, message);
}
public static void v(String message, Throwable throwable) {
Log.v(TAG, message, throwable);
}
public static void d(String message) {
Log.d(TAG, message);
}
public static void d(String message, Throwable throwable) {
Log.d(TAG, message, throwable);
}
public static void i(String message) {
Log.i(TAG, message);
}
public static void i(String message, Throwable throwable) {
Log.i(TAG, message, throwable);
}
public static void w(String message) {
Log.w(TAG, message);
}
public static void w(String message, Throwable throwable) {
Log.w(TAG, message, throwable);
}
public static void e(String message) {
Log.e(TAG, message);
}
public static void e(String message, Throwable throwable) {
Log.e(TAG, message, throwable);
}
public static void wtf(String message) {
Log.wtf(TAG, message);
}
public static void wtf(String message, Throwable throwable) {
Log.wtf(TAG, message, throwable);
}
public static void test(String message) {
if (ChanApplication.DEVELOPER_MODE) {
Log.i(TAG_TEST, message);
}
}
}
Loading…
Cancel
Save