Create a dedicated start activity.

captchafix
Floens 11 years ago
parent 4ad981a996
commit 85d12cda39
  1. 93
      Clover/app/src/main/AndroidManifest.xml
  2. 739
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java
  3. 753
      Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java
  4. 4
      Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java

@ -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/
Copyright (C) 2014 Floens
@ -16,18 +15,13 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.floens.chan"
android:installLocation="auto">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
<application
android:name="org.floens.chan.ChanApplication"
@ -36,117 +30,114 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="org.floens.chan.ui.activity.BoardActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
android:name=".ui.activity.BoardActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activity.ChanActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED">
</action>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="4chan.org"
android:pathPrefix="/"
android:scheme="http"/>
android:scheme="http" />
<data
android:host="4chan.org"
android:pathPrefix="/"
android:scheme="https"/>
android:scheme="https" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="http"/>
android:scheme="http" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="https"/>
android:scheme="https" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="http"/>
android:scheme="http" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="https"/>
android:scheme="https" />
</intent-filter>
</activity>
<activity
android:name="org.floens.chan.ui.activity.ReplyActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
</activity>
android:windowSoftInputMode="adjustResize" />
<activity
android:name="org.floens.chan.ui.activity.SettingsActivity"
android:label="@string/action_settings"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<activity
android:name="org.floens.chan.ui.activity.WatchSettingsActivity"
android:label="@string/preference_watch_settings"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<activity
android:name="org.floens.chan.ui.activity.PassSettingsActivity"
android:label="@string/preference_pass_settings"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<activity
android:name="org.floens.chan.ui.activity.AboutActivity"
android:label="@string/preference_about"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<activity
android:name="org.floens.chan.ui.activity.BoardEditor"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/board_edit"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<activity
android:name="org.floens.chan.ui.activity.ImageViewActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/Theme.ImageList">
</activity>
<activity android:name="org.floens.chan.ui.activity.ImagePickActivity">
</activity>
<activity android:name="org.floens.chan.ui.activity.DeveloperActivity">
</activity>
android:theme="@style/Theme.ImageList" />
<activity android:name="org.floens.chan.ui.activity.ImagePickActivity" />
<activity android:name="org.floens.chan.ui.activity.DeveloperActivity" />
<activity
android:name="org.floens.chan.ui.activity.AdvancedSettingsActivity"
android:label="@string/settings_advanced_label"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity">
android:parentActivityName=".ui.activity.ChanActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.ui.activity.BoardActivity"/>
android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity>
<service
android:name=".ui.service.WatchNotifier"
android:exported="false">
</service>
android:exported="false" />
</application>
</manifest>
</manifest>

@ -17,737 +17,44 @@
*/
package org.floens.chan.ui.activity;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.Spinner;
import android.widget.TextView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.fragment.ThreadFragment;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils;
import java.util.List;
public class BoardActivity extends BaseActivity implements AdapterView.OnItemSelectedListener, BoardManager.BoardChangeListener {
private static final String TAG = "BoardActivity";
private Loadable boardLoadable;
private Loadable threadLoadable;
private ThreadFragment boardFragment;
private ThreadFragment threadFragment;
private boolean ignoreNextOnItemSelected = false;
private Spinner boardSpinner;
private BoardSpinnerAdapter spinnerAdapter;
/**
* Not called StartActivity because than the launcher icon would disappear.
* Instead it's called like the old launcher activity, BoardActivity.
*/
public class BoardActivity extends Activity {
private static final String TAG = "StartActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ChanApplication.getBoardManager().addListener(this);
boardLoadable = new Loadable();
threadLoadable = new Loadable();
boardFragment = ThreadFragment.newInstance(this);
setBoardFragmentViewMode();
threadFragment = ThreadFragment.newInstance(this);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.left_pane, boardFragment);
ft.replace(R.id.right_pane, threadFragment);
ft.commitAllowingStateLoss();
final ActionBar actionBar = getActionBar();
boardSpinner = new Spinner(actionBar.getThemedContext());
spinnerAdapter = new BoardSpinnerAdapter(this, boardSpinner);
boardSpinner.setAdapter(spinnerAdapter);
boardSpinner.setOnItemSelectedListener(this);
actionBar.setCustomView(boardSpinner);
actionBar.setDisplayShowCustomEnabled(true);
updatePaneState();
Intent startIntent = getIntent();
Uri startUri = startIntent.getData();
if (savedInstanceState != null) {
threadLoadable.readFromBundle(this, "thread", savedInstanceState);
startLoadingThread(threadLoadable);
// Reset page etc.
Loadable tmp = new Loadable();
tmp.readFromBundle(this, "board", savedInstanceState);
startLoadingBoard(new Loadable(tmp.board));
} else {
if (startUri != null) {
handleIntentURI(startUri);
}
if (boardLoadable.mode == Loadable.Mode.INVALID) {
List<Board> savedValues = ChanApplication.getBoardManager().getSavedBoards();
if (savedValues.size() > 0) {
startLoadingBoard(new Loadable(savedValues.get(0).value));
}
// http://stackoverflow.com/a/7748416/1001608
// Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373
// for more details. Essentially, the market launches the main activity on top of other activities.
// we never want this to happen. Instead, we check if we are the root and if not, we finish.
if (!isTaskRoot()) {
final Intent intent = getIntent();
final String intentAction = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
Logger.w(TAG, "StartActivity is not the root. Finishing StartActivity instead of launching.");
finish();
return;
}
}
if (startIntent.getExtras() != null) {
handleExtraBundle(startIntent.getExtras());
}
ignoreNextOnItemSelected = true;
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
if (intent.getExtras() != null) {
handleExtraBundle(intent.getExtras());
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
boardLoadable.writeToBundle(this, "board", outState);
threadLoadable.writeToBundle(this, "thread", outState);
}
@Override
protected void onStart() {
super.onStart();
ChanApplication.getInstance().activityEnteredForeground();
}
@Override
protected void onStop() {
super.onStop();
ChanApplication.getInstance().activityEnteredBackground();
}
@Override
protected void onPause() {
super.onPause();
ChanApplication.getWatchManager().updateDatabase();
}
@Override
protected void onDestroy() {
super.onDestroy();
ChanApplication.getBoardManager().removeListener(this);
}
@Override
protected void initDrawer() {
pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer, R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
};
super.initDrawer();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
pinDrawerListener.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
pinDrawerListener.onConfigurationChanged(newConfig);
updatePaneState();
}
@Override
public void onBackPressed() {
if (threadPane.isOpen()) {
super.onBackPressed();
} else {
threadPane.openPane();
}
}
@Override
public void openPin(Pin pin) {
startLoadingThread(pin.loadable);
pinDrawer.closeDrawer(pinDrawerView);
}
@Override
public void onOPClicked(Post post) {
Loadable l = new Loadable(post.board, post.no);
l.generateTitle(post);
startLoadingThread(l);
}
@Override
public void onOpenThread(Loadable thread) {
startLoadingThread(thread);
}
@Override
public void onThreadLoaded(Loadable loadable, List<Post> posts) {
updateActionBarState();
pinnedAdapter.notifyDataSetChanged();
}
@Override
public void updatePin(Pin pin) {
super.updatePin(pin);
updateActionBarState();
}
@Override
public void onNothingSelected(final AdapterView<?> parent) {
Intent intent = new Intent(this, ChanActivity.class);
startActivity(intent);
}
@Override
public void onPanelClosed(View view) {
updateActionBarState();
}
@Override
public void onPanelOpened(View view) {
updateActionBarState();
}
@Override
public void onBoardsChanged() {
spinnerAdapter.setBoards();
spinnerAdapter.notifyDataSetChanged();
}
private void handleExtraBundle(Bundle extras) {
int pinId = extras.getInt("pin_id", -2);
if (pinId != -2) {
if (pinId == -1) {
pinDrawer.openDrawer(pinDrawerView);
} else {
Pin pin = ChanApplication.getWatchManager().findPinById(pinId);
if (pin != null) {
startLoadingThread(pin.loadable);
}
}
}
}
private void updatePaneState() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
FrameLayout left = (FrameLayout) findViewById(R.id.left_pane);
FrameLayout right = (FrameLayout) findViewById(R.id.right_pane);
LayoutParams leftParams = left.getLayoutParams();
LayoutParams rightParams = right.getLayoutParams();
boolean wasSlidable = threadPane.isSlideable();
boolean isSlidable;
// Content view dp's:
// Nexus 4 is 384 x 640 dp
// Nexus 7 is 600 x 960 dp
// Nexus 10 is 800 x 1280 dp
if (ChanPreferences.getForcePhoneLayout()) {
leftParams.width = width - Utils.dp(30);
rightParams.width = width;
isSlidable = true;
} else {
if (width < Utils.dp(400)) {
leftParams.width = width - Utils.dp(30);
rightParams.width = width;
isSlidable = true;
} else if (width < Utils.dp(800)) {
leftParams.width = width - Utils.dp(60);
rightParams.width = width;
isSlidable = true;
} else if (width < Utils.dp(1000)) {
leftParams.width = Utils.dp(300);
rightParams.width = width - Utils.dp(300);
isSlidable = false;
} else {
leftParams.width = Utils.dp(400);
rightParams.width = width - Utils.dp(400);
isSlidable = false;
}
}
left.setLayoutParams(leftParams);
right.setLayoutParams(rightParams);
threadPane.requestLayout();
left.requestLayout();
right.requestLayout();
LayoutParams drawerParams = pinDrawerView.getLayoutParams();
if (width < Utils.dp(340)) {
drawerParams.width = Utils.dp(280);
} else {
drawerParams.width = Utils.dp(320);
}
pinDrawerView.setLayoutParams(drawerParams);
updateActionBarState();
if (isSlidable != wasSlidable) {
// Terrible hack to sync state for some devices when it changes slidable mode
threadPane.postDelayed(new Runnable() {
@Override
public void run() {
updateActionBarState();
}
}, 1000);
}
}
private void updateActionBarState() {
// Force the actionbar state after the ThreadPane layout,
// otherwise the ThreadPane incorrectly reports that it's not slidable.
threadPane.post(new Runnable() {
@Override
public void run() {
updateActionBarStateCallback();
}
});
}
private void updateActionBarStateCallback() {
final ActionBar actionBar = getActionBar();
if (threadPane.isSlideable()) {
if (threadPane.isOpen()) {
actionBar.setDisplayShowCustomEnabled(true);
spinnerAdapter.setBoard(boardLoadable.board);
actionBar.setTitle("");
pinDrawerListener.setDrawerIndicatorEnabled(true);
if (boardLoadable.isBoardMode()) {
setShareUrl(ChanUrls.getBoardUrlDesktop(boardLoadable.board));
} else if (boardLoadable.isCatalogMode()) {
setShareUrl(ChanUrls.getCatalogUrlDesktop(boardLoadable.board));
}
} else {
actionBar.setDisplayShowCustomEnabled(false);
actionBar.setTitle(threadLoadable.title);
pinDrawerListener.setDrawerIndicatorEnabled(false);
if (threadLoadable.isThreadMode())
setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
}
} else {
actionBar.setDisplayShowCustomEnabled(true);
pinDrawerListener.setDrawerIndicatorEnabled(true);
actionBar.setTitle(threadLoadable.title);
if (threadLoadable.isThreadMode()) {
setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
}
}
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
invalidateOptionsMenu();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean open = threadPane.isOpen();
boolean slidable = threadPane.isSlideable();
setMenuItemEnabled(menu.findItem(R.id.action_reload_board), slidable && open);
setMenuItemEnabled(menu.findItem(R.id.action_reload_thread), slidable && !open);
setMenuItemEnabled(menu.findItem(R.id.action_reload_tablet), !slidable);
setMenuItemEnabled(menu.findItem(R.id.action_pin), !slidable || !open);
setMenuItemEnabled(menu.findItem(R.id.action_reply), slidable);
setMenuItemEnabled(menu.findItem(R.id.action_reply_tablet), !slidable);
setMenuItemEnabled(menu.findItem(R.id.action_board_view_mode), !slidable || open);
if (ChanPreferences.getBoardViewMode().equals("list")) {
menu.findItem(R.id.action_board_view_mode_list).setChecked(true);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
menu.findItem(R.id.action_board_view_mode_grid).setChecked(true);
}
setMenuItemEnabled(menu.findItem(R.id.action_search), slidable);
setMenuItemEnabled(menu.findItem(R.id.action_search_tablet), !slidable);
return super.onPrepareOptionsMenu(menu);
}
private void setMenuItemEnabled(MenuItem item, boolean enabled) {
if (item != null) {
item.setVisible(enabled);
item.setEnabled(enabled);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (pinDrawerListener.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.action_reload_board:
case R.id.action_reload_tablet_board:
boardFragment.reload();
return true;
case R.id.action_reload_thread:
case R.id.action_reload_tablet_thread:
threadFragment.reload();
return true;
case R.id.action_reply:
if (threadPane.isOpen()) {
boardFragment.openReply();
} else {
threadFragment.openReply();
}
return true;
case R.id.action_reply_board:
boardFragment.openReply();
return true;
case R.id.action_reply_thread:
threadFragment.openReply();
return true;
case R.id.action_pin:
if (threadFragment.hasLoader()) {
Loader loader = threadFragment.getLoader();
if (loader.getCachedPosts().size() > 0) {
ChanApplication.getWatchManager().addPin(loader.getLoadable(), loader.getCachedPosts().get(0));
pinDrawer.openDrawer(pinDrawerView);
}
}
return true;
case R.id.action_open_browser:
openInBrowser();
return true;
case R.id.action_board_view_mode_grid:
if (!ChanPreferences.getBoardViewMode().equals("grid")) {
ChanPreferences.setBoardViewMode("grid");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
return true;
case R.id.action_board_view_mode_list:
if (!ChanPreferences.getBoardViewMode().equals("list")) {
ChanPreferences.setBoardViewMode("list");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
return true;
case R.id.action_search:
if (threadPane.isOpen()) {
boardFragment.startFiltering();
} else {
threadFragment.startFiltering();
}
return true;
case R.id.action_search_board:
boardFragment.startFiltering();
return true;
case R.id.action_search_thread:
threadFragment.startFiltering();
return true;
case android.R.id.home:
threadPane.openPane();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id) {
if (ignoreNextOnItemSelected) {
Logger.d(TAG, "Ignoring onItemSelected");
ignoreNextOnItemSelected = false;
return;
}
spinnerAdapter.onItemSelected(position);
}
private void startLoadingBoard(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID)
return;
boardLoadable = loadable;
if (ChanPreferences.getBoardMode().equals("catalog")) {
boardLoadable.mode = Loadable.Mode.CATALOG;
} else if (ChanPreferences.getBoardMode().equals("pages")) {
boardLoadable.mode = Loadable.Mode.BOARD;
}
// Force catalog mode when using grid
if (boardFragment.getViewMode() == ThreadManager.ViewMode.GRID) {
boardLoadable.mode = Loadable.Mode.CATALOG;
}
boardFragment.bindLoadable(boardLoadable);
boardFragment.requestData();
updateActionBarState();
}
private void startLoadingThread(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID)
return;
Pin pin = ChanApplication.getWatchManager().findPinByLoadable(loadable);
if (pin != null) {
// Use the loadable from the pin.
// This way we can store the listview position in the pin loadable,
// and not in a separate loadable instance.
loadable = pin.loadable;
}
threadLoadable = loadable;
threadFragment.bindLoadable(loadable);
threadFragment.requestData();
threadPane.closePane();
updateActionBarState();
}
/**
* Handle opening from an external url.
*
* @param startUri
*/
private void handleIntentURI(Uri startUri) {
Logger.d(TAG, "Opening " + startUri.getPath());
List<String> parts = startUri.getPathSegments();
if (parts.size() == 1) {
// Board mode
String rawBoard = parts.get(0);
if (ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
startLoadingBoard(new Loadable(rawBoard));
} else {
handleIntentURIFallback(startUri.toString());
}
} else if (parts.size() >= 3) {
// Thread mode
String rawBoard = parts.get(0);
int no = -1;
try {
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException e) {
}
int post = -1;
String fragment = startUri.getFragment();
if (fragment != null) {
int index = fragment.indexOf("p");
if (index >= 0) {
try {
post = Integer.parseInt(fragment.substring(index + 1));
} catch (NumberFormatException e) {
}
}
}
if (no >= 0 && ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
startLoadingThread(new Loadable(rawBoard, no));
if (post >= 0) {
threadFragment.highlightPost(post);
}
} else {
handleIntentURIFallback(startUri.toString());
}
} else {
showUrlOpenPicker(startUri.toString());
}
}
private void handleIntentURIFallback(final String url) {
new AlertDialog.Builder(this).setTitle(R.string.open_unknown_title).setMessage(R.string.open_unknown)
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showUrlOpenPicker(url);
}
}).setCancelable(false).create().show();
}
private void setBoardFragmentViewMode() {
if (ChanPreferences.getBoardViewMode().equals("list")) {
boardFragment.setViewMode(ThreadManager.ViewMode.LIST);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
boardFragment.setViewMode(ThreadManager.ViewMode.GRID);
}
}
private class BoardSpinnerAdapter extends BaseAdapter {
private static final int VIEW_TYPE_ITEM = 0;
private static final int VIEW_TYPE_ADD = 1;
private Context context;
private Spinner spinner;
private List<Board> boards;
private int lastSelectedPosition = 0;
public BoardSpinnerAdapter(Context context, Spinner spinner) {
this.context = context;
this.spinner = spinner;
setBoards();
}
public void setBoards() {
boards = ChanApplication.getBoardManager().getSavedBoards();
}
public void setBoard(String boardValue) {
for (int i = 0; i < boards.size(); i++) {
if (boards.get(i).value.equals(boardValue)) {
spinner.setSelection(i);
return;
}
}
}
public void onItemSelected(int position) {
if (position >= 0 && position < boards.size()) {
Loadable board = new Loadable(boards.get(position).value);
// onItemSelected is called after the view initializes,
// ignore if it's the same board
if (boardLoadable.equals(board))
return;
startLoadingBoard(board);
lastSelectedPosition = position;
} else {
startActivity(new Intent(context, BoardEditor.class));
spinner.setSelection(lastSelectedPosition);
}
}
@Override
public int getCount() {
return boards.size() + 1;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position == getCount() - 1 ? VIEW_TYPE_ADD : VIEW_TYPE_ITEM;
}
@Override
public long getItemId(final int position) {
return position;
}
@Override
public String getItem(final int position) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM:
return boards.get(position).key;
case VIEW_TYPE_ADD:
return context.getString(R.string.board_select_add);
default:
return "";
}
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM: {
if (convertView == null || (Integer) convertView.getTag() != VIEW_TYPE_ITEM) {
convertView = LayoutInflater.from(context).inflate(R.layout.board_select_spinner, null);
convertView.setTag(VIEW_TYPE_ITEM);
}
TextView textView = (TextView) convertView;
textView.setText(getItem(position));
return textView;
}
case VIEW_TYPE_ADD: {
if (convertView == null || (Integer) convertView.getTag() != VIEW_TYPE_ADD) {
convertView = LayoutInflater.from(context).inflate(R.layout.board_select_add, null);
convertView.setTag(VIEW_TYPE_ADD);
}
TextView textView = (TextView) convertView;
textView.setText(getItem(position));
return textView;
}
}
return null;
}
protected void onRestart() {
super.onRestart();
finish();
}
}

@ -0,0 +1,753 @@
/*
* Clover - 4chan browser https://github.com/Floens/Clover/
* Copyright (C) 2014 Floens
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.ui.activity;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.Spinner;
import android.widget.TextView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.fragment.ThreadFragment;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils;
import java.util.List;
public class ChanActivity extends BaseActivity implements AdapterView.OnItemSelectedListener, BoardManager.BoardChangeListener {
private static final String TAG = "ChanActivity";
private Loadable boardLoadable;
private Loadable threadLoadable;
private ThreadFragment boardFragment;
private ThreadFragment threadFragment;
private boolean ignoreNextOnItemSelected = false;
private Spinner boardSpinner;
private BoardSpinnerAdapter spinnerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ChanApplication.getBoardManager().addListener(this);
boardLoadable = new Loadable();
threadLoadable = new Loadable();
boardFragment = ThreadFragment.newInstance(this);
setBoardFragmentViewMode();
threadFragment = ThreadFragment.newInstance(this);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.left_pane, boardFragment);
ft.replace(R.id.right_pane, threadFragment);
ft.commitAllowingStateLoss();
final ActionBar actionBar = getActionBar();
boardSpinner = new Spinner(actionBar.getThemedContext());
spinnerAdapter = new BoardSpinnerAdapter(this, boardSpinner);
boardSpinner.setAdapter(spinnerAdapter);
boardSpinner.setOnItemSelectedListener(this);
actionBar.setCustomView(boardSpinner);
actionBar.setDisplayShowCustomEnabled(true);
updatePaneState();
Intent startIntent = getIntent();
Uri startUri = startIntent.getData();
if (savedInstanceState != null) {
threadLoadable.readFromBundle(this, "thread", savedInstanceState);
startLoadingThread(threadLoadable);
// Reset page etc.
Loadable tmp = new Loadable();
tmp.readFromBundle(this, "board", savedInstanceState);
startLoadingBoard(new Loadable(tmp.board));
} else {
if (startUri != null) {
handleIntentURI(startUri);
}
if (boardLoadable.mode == Loadable.Mode.INVALID) {
List<Board> savedValues = ChanApplication.getBoardManager().getSavedBoards();
if (savedValues.size() > 0) {
startLoadingBoard(new Loadable(savedValues.get(0).value));
}
}
}
if (startIntent.getExtras() != null) {
handleExtraBundle(startIntent.getExtras());
}
ignoreNextOnItemSelected = true;
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
if (intent.getExtras() != null) {
handleExtraBundle(intent.getExtras());
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
boardLoadable.writeToBundle(this, "board", outState);
threadLoadable.writeToBundle(this, "thread", outState);
}
@Override
protected void onStart() {
super.onStart();
ChanApplication.getInstance().activityEnteredForeground();
}
@Override
protected void onStop() {
super.onStop();
ChanApplication.getInstance().activityEnteredBackground();
}
@Override
protected void onPause() {
super.onPause();
ChanApplication.getWatchManager().updateDatabase();
}
@Override
protected void onDestroy() {
super.onDestroy();
ChanApplication.getBoardManager().removeListener(this);
}
@Override
protected void initDrawer() {
pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer, R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
};
super.initDrawer();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
pinDrawerListener.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
pinDrawerListener.onConfigurationChanged(newConfig);
updatePaneState();
}
@Override
public void onBackPressed() {
if (threadPane.isOpen()) {
super.onBackPressed();
} else {
threadPane.openPane();
}
}
@Override
public void openPin(Pin pin) {
startLoadingThread(pin.loadable);
pinDrawer.closeDrawer(pinDrawerView);
}
@Override
public void onOPClicked(Post post) {
Loadable l = new Loadable(post.board, post.no);
l.generateTitle(post);
startLoadingThread(l);
}
@Override
public void onOpenThread(Loadable thread) {
startLoadingThread(thread);
}
@Override
public void onThreadLoaded(Loadable loadable, List<Post> posts) {
updateActionBarState();
pinnedAdapter.notifyDataSetChanged();
}
@Override
public void updatePin(Pin pin) {
super.updatePin(pin);
updateActionBarState();
}
@Override
public void onNothingSelected(final AdapterView<?> parent) {
}
@Override
public void onPanelClosed(View view) {
updateActionBarState();
}
@Override
public void onPanelOpened(View view) {
updateActionBarState();
}
@Override
public void onBoardsChanged() {
spinnerAdapter.setBoards();
spinnerAdapter.notifyDataSetChanged();
}
private void handleExtraBundle(Bundle extras) {
int pinId = extras.getInt("pin_id", -2);
if (pinId != -2) {
if (pinId == -1) {
pinDrawer.openDrawer(pinDrawerView);
} else {
Pin pin = ChanApplication.getWatchManager().findPinById(pinId);
if (pin != null) {
startLoadingThread(pin.loadable);
}
}
}
}
private void updatePaneState() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
FrameLayout left = (FrameLayout) findViewById(R.id.left_pane);
FrameLayout right = (FrameLayout) findViewById(R.id.right_pane);
LayoutParams leftParams = left.getLayoutParams();
LayoutParams rightParams = right.getLayoutParams();
boolean wasSlidable = threadPane.isSlideable();
boolean isSlidable;
// Content view dp's:
// Nexus 4 is 384 x 640 dp
// Nexus 7 is 600 x 960 dp
// Nexus 10 is 800 x 1280 dp
if (ChanPreferences.getForcePhoneLayout()) {
leftParams.width = width - Utils.dp(30);
rightParams.width = width;
isSlidable = true;
} else {
if (width < Utils.dp(400)) {
leftParams.width = width - Utils.dp(30);
rightParams.width = width;
isSlidable = true;
} else if (width < Utils.dp(800)) {
leftParams.width = width - Utils.dp(60);
rightParams.width = width;
isSlidable = true;
} else if (width < Utils.dp(1000)) {
leftParams.width = Utils.dp(300);
rightParams.width = width - Utils.dp(300);
isSlidable = false;
} else {
leftParams.width = Utils.dp(400);
rightParams.width = width - Utils.dp(400);
isSlidable = false;
}
}
left.setLayoutParams(leftParams);
right.setLayoutParams(rightParams);
threadPane.requestLayout();
left.requestLayout();
right.requestLayout();
LayoutParams drawerParams = pinDrawerView.getLayoutParams();
if (width < Utils.dp(340)) {
drawerParams.width = Utils.dp(280);
} else {
drawerParams.width = Utils.dp(320);
}
pinDrawerView.setLayoutParams(drawerParams);
updateActionBarState();
if (isSlidable != wasSlidable) {
// Terrible hack to sync state for some devices when it changes slidable mode
threadPane.postDelayed(new Runnable() {
@Override
public void run() {
updateActionBarState();
}
}, 1000);
}
}
private void updateActionBarState() {
// Force the actionbar state after the ThreadPane layout,
// otherwise the ThreadPane incorrectly reports that it's not slidable.
threadPane.post(new Runnable() {
@Override
public void run() {
updateActionBarStateCallback();
}
});
}
private void updateActionBarStateCallback() {
final ActionBar actionBar = getActionBar();
if (threadPane.isSlideable()) {
if (threadPane.isOpen()) {
actionBar.setDisplayShowCustomEnabled(true);
spinnerAdapter.setBoard(boardLoadable.board);
actionBar.setTitle("");
pinDrawerListener.setDrawerIndicatorEnabled(true);
if (boardLoadable.isBoardMode()) {
setShareUrl(ChanUrls.getBoardUrlDesktop(boardLoadable.board));
} else if (boardLoadable.isCatalogMode()) {
setShareUrl(ChanUrls.getCatalogUrlDesktop(boardLoadable.board));
}
} else {
actionBar.setDisplayShowCustomEnabled(false);
actionBar.setTitle(threadLoadable.title);
pinDrawerListener.setDrawerIndicatorEnabled(false);
if (threadLoadable.isThreadMode())
setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
}
} else {
actionBar.setDisplayShowCustomEnabled(true);
pinDrawerListener.setDrawerIndicatorEnabled(true);
actionBar.setTitle(threadLoadable.title);
if (threadLoadable.isThreadMode()) {
setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no));
}
}
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
invalidateOptionsMenu();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean open = threadPane.isOpen();
boolean slidable = threadPane.isSlideable();
setMenuItemEnabled(menu.findItem(R.id.action_reload_board), slidable && open);
setMenuItemEnabled(menu.findItem(R.id.action_reload_thread), slidable && !open);
setMenuItemEnabled(menu.findItem(R.id.action_reload_tablet), !slidable);
setMenuItemEnabled(menu.findItem(R.id.action_pin), !slidable || !open);
setMenuItemEnabled(menu.findItem(R.id.action_reply), slidable);
setMenuItemEnabled(menu.findItem(R.id.action_reply_tablet), !slidable);
setMenuItemEnabled(menu.findItem(R.id.action_board_view_mode), !slidable || open);
if (ChanPreferences.getBoardViewMode().equals("list")) {
menu.findItem(R.id.action_board_view_mode_list).setChecked(true);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
menu.findItem(R.id.action_board_view_mode_grid).setChecked(true);
}
setMenuItemEnabled(menu.findItem(R.id.action_search), slidable);
setMenuItemEnabled(menu.findItem(R.id.action_search_tablet), !slidable);
return super.onPrepareOptionsMenu(menu);
}
private void setMenuItemEnabled(MenuItem item, boolean enabled) {
if (item != null) {
item.setVisible(enabled);
item.setEnabled(enabled);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (pinDrawerListener.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.action_reload_board:
case R.id.action_reload_tablet_board:
boardFragment.reload();
return true;
case R.id.action_reload_thread:
case R.id.action_reload_tablet_thread:
threadFragment.reload();
return true;
case R.id.action_reply:
if (threadPane.isOpen()) {
boardFragment.openReply();
} else {
threadFragment.openReply();
}
return true;
case R.id.action_reply_board:
boardFragment.openReply();
return true;
case R.id.action_reply_thread:
threadFragment.openReply();
return true;
case R.id.action_pin:
if (threadFragment.hasLoader()) {
Loader loader = threadFragment.getLoader();
if (loader.getCachedPosts().size() > 0) {
ChanApplication.getWatchManager().addPin(loader.getLoadable(), loader.getCachedPosts().get(0));
pinDrawer.openDrawer(pinDrawerView);
}
}
return true;
case R.id.action_open_browser:
openInBrowser();
return true;
case R.id.action_board_view_mode_grid:
if (!ChanPreferences.getBoardViewMode().equals("grid")) {
ChanPreferences.setBoardViewMode("grid");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
return true;
case R.id.action_board_view_mode_list:
if (!ChanPreferences.getBoardViewMode().equals("list")) {
ChanPreferences.setBoardViewMode("list");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
return true;
case R.id.action_search:
if (threadPane.isOpen()) {
boardFragment.startFiltering();
} else {
threadFragment.startFiltering();
}
return true;
case R.id.action_search_board:
boardFragment.startFiltering();
return true;
case R.id.action_search_thread:
threadFragment.startFiltering();
return true;
case android.R.id.home:
threadPane.openPane();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id) {
if (ignoreNextOnItemSelected) {
Logger.d(TAG, "Ignoring onItemSelected");
ignoreNextOnItemSelected = false;
return;
}
spinnerAdapter.onItemSelected(position);
}
private void startLoadingBoard(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID)
return;
boardLoadable = loadable;
if (ChanPreferences.getBoardMode().equals("catalog")) {
boardLoadable.mode = Loadable.Mode.CATALOG;
} else if (ChanPreferences.getBoardMode().equals("pages")) {
boardLoadable.mode = Loadable.Mode.BOARD;
}
// Force catalog mode when using grid
if (boardFragment.getViewMode() == ThreadManager.ViewMode.GRID) {
boardLoadable.mode = Loadable.Mode.CATALOG;
}
boardFragment.bindLoadable(boardLoadable);
boardFragment.requestData();
updateActionBarState();
}
private void startLoadingThread(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID)
return;
Pin pin = ChanApplication.getWatchManager().findPinByLoadable(loadable);
if (pin != null) {
// Use the loadable from the pin.
// This way we can store the listview position in the pin loadable,
// and not in a separate loadable instance.
loadable = pin.loadable;
}
threadLoadable = loadable;
threadFragment.bindLoadable(loadable);
threadFragment.requestData();
threadPane.closePane();
updateActionBarState();
}
/**
* Handle opening from an external url.
*
* @param startUri
*/
private void handleIntentURI(Uri startUri) {
Logger.d(TAG, "Opening " + startUri.getPath());
List<String> parts = startUri.getPathSegments();
if (parts.size() == 1) {
// Board mode
String rawBoard = parts.get(0);
if (ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
startLoadingBoard(new Loadable(rawBoard));
} else {
handleIntentURIFallback(startUri.toString());
}
} else if (parts.size() >= 3) {
// Thread mode
String rawBoard = parts.get(0);
int no = -1;
try {
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException e) {
}
int post = -1;
String fragment = startUri.getFragment();
if (fragment != null) {
int index = fragment.indexOf("p");
if (index >= 0) {
try {
post = Integer.parseInt(fragment.substring(index + 1));
} catch (NumberFormatException e) {
}
}
}
if (no >= 0 && ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
startLoadingThread(new Loadable(rawBoard, no));
if (post >= 0) {
threadFragment.highlightPost(post);
}
} else {
handleIntentURIFallback(startUri.toString());
}
} else {
showUrlOpenPicker(startUri.toString());
}
}
private void handleIntentURIFallback(final String url) {
new AlertDialog.Builder(this).setTitle(R.string.open_unknown_title).setMessage(R.string.open_unknown)
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showUrlOpenPicker(url);
}
}).setCancelable(false).create().show();
}
private void setBoardFragmentViewMode() {
if (ChanPreferences.getBoardViewMode().equals("list")) {
boardFragment.setViewMode(ThreadManager.ViewMode.LIST);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
boardFragment.setViewMode(ThreadManager.ViewMode.GRID);
}
}
private class BoardSpinnerAdapter extends BaseAdapter {
private static final int VIEW_TYPE_ITEM = 0;
private static final int VIEW_TYPE_ADD = 1;
private Context context;
private Spinner spinner;
private List<Board> boards;
private int lastSelectedPosition = 0;
public BoardSpinnerAdapter(Context context, Spinner spinner) {
this.context = context;
this.spinner = spinner;
setBoards();
}
public void setBoards() {
boards = ChanApplication.getBoardManager().getSavedBoards();
}
public void setBoard(String boardValue) {
for (int i = 0; i < boards.size(); i++) {
if (boards.get(i).value.equals(boardValue)) {
spinner.setSelection(i);
return;
}
}
}
public void onItemSelected(int position) {
if (position >= 0 && position < boards.size()) {
Loadable board = new Loadable(boards.get(position).value);
// onItemSelected is called after the view initializes,
// ignore if it's the same board
if (boardLoadable.equals(board))
return;
startLoadingBoard(board);
lastSelectedPosition = position;
} else {
startActivity(new Intent(context, BoardEditor.class));
spinner.setSelection(lastSelectedPosition);
}
}
@Override
public int getCount() {
return boards.size() + 1;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position == getCount() - 1 ? VIEW_TYPE_ADD : VIEW_TYPE_ITEM;
}
@Override
public long getItemId(final int position) {
return position;
}
@Override
public String getItem(final int position) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM:
return boards.get(position).key;
case VIEW_TYPE_ADD:
return context.getString(R.string.board_select_add);
default:
return "";
}
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
switch (getItemViewType(position)) {
case VIEW_TYPE_ITEM: {
if (convertView == null || (Integer) convertView.getTag() != VIEW_TYPE_ITEM) {
convertView = LayoutInflater.from(context).inflate(R.layout.board_select_spinner, null);
convertView.setTag(VIEW_TYPE_ITEM);
}
TextView textView = (TextView) convertView;
textView.setText(getItem(position));
return textView;
}
case VIEW_TYPE_ADD: {
if (convertView == null || (Integer) convertView.getTag() != VIEW_TYPE_ADD) {
convertView = LayoutInflater.from(context).inflate(R.layout.board_select_add, null);
convertView.setTag(VIEW_TYPE_ADD);
}
TextView textView = (TextView) convertView;
textView.setText(getItem(position));
return textView;
}
}
return null;
}
}
}

@ -33,7 +33,7 @@ import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.watch.PinWatcher;
import org.floens.chan.ui.activity.BoardActivity;
import org.floens.chan.ui.activity.ChanActivity;
import org.floens.chan.utils.Utils;
import java.util.ArrayList;
@ -213,7 +213,7 @@ public class WatchNotifier extends Service {
@SuppressWarnings("deprecation")
private Notification getNotificationFor(String tickerText, String contentTitle, String contentText, int contentNumber,
List<CharSequence> expandedLines, boolean light, boolean makeSound, Pin target) {
Intent intent = new Intent(this, BoardActivity.class);
Intent intent = new Intent(this, ChanActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |

Loading…
Cancel
Save