diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java index 92bf93c1..62126de6 100644 --- a/Chan/src/org/floens/chan/ChanApplication.java +++ b/Chan/src/org/floens/chan/ChanApplication.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); } } diff --git a/Chan/src/org/floens/chan/activity/BaseActivity.java b/Chan/src/org/floens/chan/activity/BaseActivity.java index 448c5594..19e20e49 100644 --- a/Chan/src/org/floens/chan/activity/BaseActivity.java +++ b/Chan/src/org/floens/chan/activity/BaseActivity.java @@ -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(); - } } diff --git a/Chan/src/org/floens/chan/activity/BoardActivity.java b/Chan/src/org/floens/chan/activity/BoardActivity.java index 180e4390..f0286ac9 100644 --- a/Chan/src/org/floens/chan/activity/BoardActivity.java +++ b/Chan/src/org/floens/chan/activity/BoardActivity.java @@ -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 list = ChanApplication.getBoardManager().getMyBoardsValues(); + ArrayList list = BoardManager.getInstance().getMyBoardsValues(); int foundIndex = -1; for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(boardValue)) { diff --git a/Chan/src/org/floens/chan/activity/BoardEditor.java b/Chan/src/org/floens/chan/activity/BoardEditor.java index 6ea7ad72..f90fe3de 100644 --- a/Chan/src/org/floens/chan/activity/BoardEditor.java +++ b/Chan/src/org/floens/chan/activity/BoardEditor.java @@ -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) ChanApplication.getBoardManager().getMyBoards().clone(); + list = (ArrayList) BoardManager.getInstance().getMyBoards().clone(); adapter = new BoardEditAdapter(this, R.layout.board_view, list, this); listView = (DynamicListView) 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) list.clone()); + BoardManager.getInstance().setMyBoards((ArrayList) 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); diff --git a/Chan/src/org/floens/chan/activity/CatalogActivity.java b/Chan/src/org/floens/chan/activity/CatalogActivity.java index 67c2d63e..7f9dba42 100644 --- a/Chan/src/org/floens/chan/activity/CatalogActivity.java +++ b/Chan/src/org/floens/chan/activity/CatalogActivity.java @@ -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: diff --git a/Chan/src/org/floens/chan/adapter/PinnedAdapter.java b/Chan/src/org/floens/chan/adapter/PinnedAdapter.java index a279be5d..0b463b4c 100644 --- a/Chan/src/org/floens/chan/adapter/PinnedAdapter.java +++ b/Chan/src/org/floens/chan/adapter/PinnedAdapter.java @@ -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 { - private final HashMap idMap = new HashMap(); + private final HashMap idMap; private int idCounter; private View.OnTouchListener listener; - public PinnedAdapter(Context context, int resId, List list) { - super(context, resId, list); + public PinnedAdapter(Context context, int resId) { + super(context, resId, new ArrayList()); - int i = 0; - for (i = 0; i < list.size(); ++i) { - idMap.put(list.get(i), i); - } - - idCounter = i + 1; + idMap = new HashMap(); } public void setTouchListener(View.OnTouchListener listener) { @@ -41,6 +36,7 @@ public class PinnedAdapter extends ArrayAdapter { 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 { @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; + } + } } } diff --git a/Chan/src/org/floens/chan/database/DatabaseHelper.java b/Chan/src/org/floens/chan/database/DatabaseHelper.java index f420c66b..aa8d1336 100644 --- a/Chan/src/org/floens/chan/database/DatabaseHelper.java +++ b/Chan/src/org/floens/chan/database/DatabaseHelper.java @@ -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 + } } } + + + + + diff --git a/Chan/src/org/floens/chan/database/DatabaseManager.java b/Chan/src/org/floens/chan/database/DatabaseManager.java index c655a24b..7d246529 100644 --- a/Chan/src/org/floens/chan/database/DatabaseManager.java +++ b/Chan/src/org/floens/chan/database/DatabaseManager.java @@ -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 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; diff --git a/Chan/src/org/floens/chan/manager/BoardManager.java b/Chan/src/org/floens/chan/manager/BoardManager.java index b9556781..6657a44c 100644 --- a/Chan/src/org/floens/chan/manager/BoardManager.java +++ b/Chan/src/org/floens/chan/manager/BoardManager.java @@ -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 allBoards = new ArrayList(); @@ -27,6 +29,8 @@ public class BoardManager { private final ArrayList myBoardsValues = new ArrayList(); 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 diff --git a/Chan/src/org/floens/chan/manager/PinnedManager.java b/Chan/src/org/floens/chan/manager/PinnedManager.java index 8d5f60ea..6a368f35 100644 --- a/Chan/src/org/floens/chan/manager/PinnedManager.java +++ b/Chan/src/org/floens/chan/manager/PinnedManager.java @@ -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 list = new ArrayList(); - private final PinnedAdapter adapter; + private static PinnedManager instance; + + private final Context context; + private final List 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 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 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 getPinnedThreads() { - ArrayList tempList = new ArrayList(); - - 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 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 getPinnedListFromPreferences(String key) { - String total = ChanApplication.getPreferences().getString(key, null); - if (total == null) return null; - - ArrayList list = new ArrayList(); - - 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); } } diff --git a/Chan/src/org/floens/chan/utils/Logger.java b/Chan/src/org/floens/chan/utils/Logger.java new file mode 100644 index 00000000..ca5a6ca9 --- /dev/null +++ b/Chan/src/org/floens/chan/utils/Logger.java @@ -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); + } + } +} + + + + +