Merge branch 'dev'

Conflicts:
	Clover/build.gradle
	Clover/gradle/wrapper/gradle-wrapper.properties
material
Floens 11 years ago
commit 8e78b63031
  1. 12
      Clover/app/build.gradle
  2. 5
      Clover/app/proguard.cfg
  3. 12
      Clover/app/src/main/java/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
  4. 4
      Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java
  5. 50
      Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java
  6. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java
  7. 6
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java
  8. 47
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java
  9. 23
      Clover/app/src/main/java/org/floens/chan/ui/view/CustomScaleImageView.java
  10. 40
      Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java
  11. 2
      Clover/app/src/main/res/values/strings.xml
  12. 3
      Clover/app/src/main/res/xml/preference.xml

@ -1,12 +1,12 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 19 compileSdkVersion 21
buildToolsVersion "21.0.2" buildToolsVersion "21.1.1"
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 19 targetSdkVersion 21
versionName "v1.2.3" versionName "v1.2.3"
versionCode 41 versionCode 41
@ -70,9 +70,9 @@ dependencies {
compile 'org.jsoup:jsoup:1.7.3' compile 'org.jsoup:jsoup:1.7.3'
compile 'com.j256.ormlite:ormlite-core:4.48' compile 'com.j256.ormlite:ormlite-core:4.48'
compile 'com.j256.ormlite:ormlite-android:4.48' compile 'com.j256.ormlite:ormlite-android:4.48'
compile 'com.android.support:support-v13:18.0.+' compile 'com.android.support:support-v13:18.0.0'
compile 'com.koushikdutta.ion:ion:1.+' compile 'com.koushikdutta.ion:ion:1.3.8'
compile 'pl.droidsonroids.gif:android-gif-drawable:1.0.+' compile 'pl.droidsonroids.gif:android-gif-drawable:1.0.12'
compile files('libs/httpclientandroidlib-1.2.1.jar') compile files('libs/httpclientandroidlib-1.2.1.jar')
} }

@ -132,8 +132,3 @@
} }
-keep public class pl.droidsonroids.gif.GifIOException{*;} -keep public class pl.droidsonroids.gif.GifIOException{*;}
# Remove these when targetSdkVersion >= 21
-dontwarn pl.droidsonroids.gif.GifImageButton
-dontwarn pl.droidsonroids.gif.GifImageView
-dontwarn pl.droidsonroids.gif.GifTextView

@ -1028,6 +1028,10 @@ public class SubsamplingScaleImageView extends View {
} catch (OutOfMemoryError e) { } catch (OutOfMemoryError e) {
Log.e(TAG, "OOM in decode tile", e); Log.e(TAG, "OOM in decode tile", e);
System.gc(); System.gc();
final SubsamplingScaleImageView view = viewRef.get();
if (view != null) {
view.onOutOfMemory();
}
} }
return null; return null;
} }
@ -1092,6 +1096,10 @@ public class SubsamplingScaleImageView extends View {
} catch (OutOfMemoryError e) { } catch (OutOfMemoryError e) {
Log.e(TAG, "OOM in decode tile", e); Log.e(TAG, "OOM in decode tile", e);
System.gc(); System.gc();
final SubsamplingScaleImageView view = viewRef.get();
if (view != null) {
view.onOutOfMemory();
}
} }
return null; return null;
} }
@ -1538,6 +1546,10 @@ public class SubsamplingScaleImageView extends View {
} }
protected void onOutOfMemory() {
}
/** /**
* Call to find whether the view is initialised and ready for rendering tiles. * Call to find whether the view is initialised and ready for rendering tiles.
*/ */

@ -37,10 +37,6 @@ public class ChanPreferences {
return p().getString("preference_default_name", ""); return p().getString("preference_default_name", "");
} }
public static String getDefaultEmail() {
return p().getString("preference_default_email", "");
}
public static boolean getPinOnPost() { public static boolean getPinOnPost() {
return p().getBoolean("preference_pin_on_post", false); return p().getBoolean("preference_pin_on_post", false);
} }

@ -105,8 +105,9 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
Uri startUri = startIntent.getData(); Uri startUri = startIntent.getData();
if (savedInstanceState != null) { if (savedInstanceState != null) {
threadLoadable.readFromBundle(this, "thread", savedInstanceState); Loadable threadTmp = new Loadable();
startLoadingThread(threadLoadable); threadTmp.readFromBundle(this, "thread", savedInstanceState);
startLoadingThread(threadTmp);
// Reset page etc. // Reset page etc.
Loadable tmp = new Loadable(); Loadable tmp = new Loadable();
@ -649,9 +650,6 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
} }
private class BoardSpinnerAdapter extends BaseAdapter { 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 Context context;
private Spinner spinner; private Spinner spinner;
private List<Board> boards; private List<Board> boards;
@ -699,16 +697,6 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
return boards.size() + 1; 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 @Override
public long getItemId(final int position) { public long getItemId(final int position) {
return position; return position;
@ -716,42 +704,24 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
@Override @Override
public String getItem(final int position) { public String getItem(final int position) {
switch (getItemViewType(position)) { if (position == getCount() - 1) {
case VIEW_TYPE_ITEM:
return boards.get(position).key;
case VIEW_TYPE_ADD:
return context.getString(R.string.board_select_add); return context.getString(R.string.board_select_add);
default: } else {
return ""; return boards.get(position).key;
} }
} }
@Override @Override
public View getView(final int position, View convertView, final ViewGroup parent) { public View getView(final int position, View convertView, final ViewGroup parent) {
switch (getItemViewType(position)) { if (position == getCount() - 1) {
case VIEW_TYPE_ITEM: { TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.board_select_add, null);
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)); textView.setText(getItem(position));
return textView; return textView;
} } else {
case VIEW_TYPE_ADD: { TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.board_select_spinner, null);
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)); textView.setText(getItem(position));
return textView; return textView;
} }
} }
return null;
}
} }
} }

@ -266,7 +266,9 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang
} }
private ImageViewFragment getFragment(int i) { private ImageViewFragment getFragment(int i) {
if (i >= 0 && i < adapter.getCount()) { if (adapter == null) {
return null;
} else if (i >= 0 && i < adapter.getCount()) {
Object o = adapter.instantiateItem(viewPager, i); Object o = adapter.instantiateItem(viewPager, i);
if (o instanceof ImageViewFragment) { if (o instanceof ImageViewFragment) {
return (ImageViewFragment) o; return (ImageViewFragment) o;

@ -165,10 +165,6 @@ public class ReplyFragment extends DialogFragment {
draft.name = ChanPreferences.getDefaultName(); draft.name = ChanPreferences.getDefaultName();
} }
if (TextUtils.isEmpty(draft.email)) {
draft.email = ChanPreferences.getDefaultEmail();
}
nameView.setText(draft.name); nameView.setText(draft.name);
emailView.setText(draft.email); emailView.setText(draft.email);
subjectView.setText(draft.subject); subjectView.setText(draft.subject);
@ -383,7 +379,7 @@ public class ReplyFragment extends DialogFragment {
private void closeReply() { private void closeReply() {
if (getDialog() != null) { if (getDialog() != null) {
dismiss(); dismissAllowingStateLoss();
} else { } else {
context.finish(); context.finish();
} }

@ -19,7 +19,6 @@ package org.floens.chan.ui.fragment;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.os.Bundle; import android.os.Bundle;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -61,7 +60,6 @@ import org.floens.chan.utils.Utils;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
public class ThreadFragment extends Fragment implements ThreadManager.ThreadManagerListener, PostAdapter.PostAdapterListener { public class ThreadFragment extends Fragment implements ThreadManager.ThreadManagerListener, PostAdapter.PostAdapterListener {
private BaseActivity baseActivity;
private ThreadManager threadManager; private ThreadManager threadManager;
private Loadable loadable; private Loadable loadable;
@ -78,7 +76,6 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
public static ThreadFragment newInstance(BaseActivity activity) { public static ThreadFragment newInstance(BaseActivity activity) {
ThreadFragment fragment = new ThreadFragment(); ThreadFragment fragment = new ThreadFragment();
fragment.baseActivity = activity;
fragment.threadManager = new ThreadManager(activity, fragment); fragment.threadManager = new ThreadManager(activity, fragment);
return fragment; return fragment;
@ -171,13 +168,17 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
container = new LoadView(inflater.getContext()); container = new LoadView(inflater.getContext());
if (loadable == null) {
container.setView(getCenteredMessageView(R.string.thread_not_specified));
}
return container; return container;
} }
@Override @Override
public void onPostClicked(Post post) { public void onPostClicked(Post post) {
if (loadable.isBoardMode() || loadable.isCatalogMode()) { if (loadable.isBoardMode() || loadable.isCatalogMode()) {
baseActivity.onOPClicked(post); ((BaseActivity) getActivity()).onOPClicked(post);
} else if (loadable.isThreadMode() && isFiltering) { } else if (loadable.isThreadMode() && isFiltering) {
filterView.clearSearch(); filterView.clearSearch();
postAdapter.scrollToPost(post.no); postAdapter.scrollToPost(post.no);
@ -187,7 +188,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
@Override @Override
public void onThumbnailClicked(Post source) { public void onThumbnailClicked(Post source) {
if (postAdapter != null) { if (postAdapter != null) {
ImageViewActivity.launch(baseActivity, postAdapter, source.no, threadManager); ImageViewActivity.launch(getActivity(), postAdapter, source.no, threadManager);
} }
} }
@ -207,7 +208,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
@Override @Override
public void onOpenThread(final Loadable thread, int highlightedPost) { public void onOpenThread(final Loadable thread, int highlightedPost) {
baseActivity.onOpenThread(thread); ((BaseActivity) getActivity()).onOpenThread(thread);
this.highlightedPost = highlightedPost; this.highlightedPost = highlightedPost;
} }
@ -233,7 +234,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
highlightedPost = -1; highlightedPost = -1;
} }
baseActivity.onThreadLoaded(thread); ((BaseActivity) getActivity()).onThreadLoaded(thread);
} }
@Override @Override
@ -262,25 +263,25 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
} }
private RelativeLayout createView() { private RelativeLayout createView() {
RelativeLayout compound = new RelativeLayout(baseActivity); RelativeLayout compound = new RelativeLayout(getActivity());
LinearLayout listViewContainer = new LinearLayout(baseActivity); LinearLayout listViewContainer = new LinearLayout(getActivity());
listViewContainer.setOrientation(LinearLayout.VERTICAL); listViewContainer.setOrientation(LinearLayout.VERTICAL);
filterView = new FilterView(baseActivity); filterView = new FilterView(getActivity());
filterView.setVisibility(View.GONE); filterView.setVisibility(View.GONE);
listViewContainer.addView(filterView, Utils.MATCH_WRAP_PARAMS); listViewContainer.addView(filterView, Utils.MATCH_WRAP_PARAMS);
if (viewMode == ThreadManager.ViewMode.LIST) { if (viewMode == ThreadManager.ViewMode.LIST) {
ListView list = new ListView(baseActivity); ListView list = new ListView(getActivity());
listView = list; listView = list;
postAdapter = new PostAdapter(baseActivity, threadManager, listView, this); postAdapter = new PostAdapter(getActivity(), threadManager, listView, this);
listView.setAdapter(postAdapter); listView.setAdapter(postAdapter);
list.setSelectionFromTop(loadable.listViewIndex, loadable.listViewTop); list.setSelectionFromTop(loadable.listViewIndex, loadable.listViewTop);
} else if (viewMode == ThreadManager.ViewMode.GRID) { } else if (viewMode == ThreadManager.ViewMode.GRID) {
GridView grid = new GridView(baseActivity); GridView grid = new GridView(getActivity());
grid.setNumColumns(GridView.AUTO_FIT); grid.setNumColumns(GridView.AUTO_FIT);
TypedArray ta = baseActivity.obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0); TypedArray ta = getActivity().obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0);
int postGridWidth = ta.getDimensionPixelSize(R.styleable.PostView_grid_width, 0); int postGridWidth = ta.getDimensionPixelSize(R.styleable.PostView_grid_width, 0);
int postGridSpacing = ta.getDimensionPixelSize(R.styleable.PostView_grid_spacing, 0); int postGridSpacing = ta.getDimensionPixelSize(R.styleable.PostView_grid_spacing, 0);
ta.recycle(); ta.recycle();
@ -288,7 +289,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
grid.setVerticalSpacing(postGridSpacing); grid.setVerticalSpacing(postGridSpacing);
grid.setHorizontalSpacing(postGridSpacing); grid.setHorizontalSpacing(postGridSpacing);
listView = grid; listView = grid;
postAdapter = new PostAdapter(baseActivity, threadManager, listView, this); postAdapter = new PostAdapter(getActivity(), threadManager, listView, this);
listView.setAdapter(postAdapter); listView.setAdapter(postAdapter);
listView.setSelection(loadable.listViewIndex); listView.setSelection(loadable.listViewIndex);
} }
@ -327,7 +328,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
compound.addView(listViewContainer, Utils.MATCH_PARAMS); compound.addView(listViewContainer, Utils.MATCH_PARAMS);
if (loadable.isThreadMode()) { if (loadable.isThreadMode()) {
skip = new ImageView(baseActivity); skip = new ImageView(getActivity());
skip.setImageResource(R.drawable.skip_arrow_down); skip.setImageResource(R.drawable.skip_arrow_down);
skip.setVisibility(View.GONE); skip.setVisibility(View.GONE);
compound.addView(skip, Utils.WRAP_PARAMS); compound.addView(skip, Utils.WRAP_PARAMS);
@ -376,7 +377,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
private View getLoadErrorView(VolleyError error) { private View getLoadErrorView(VolleyError error) {
String errorMessage = getLoadErrorText(error); String errorMessage = getLoadErrorText(error);
LinearLayout wrapper = new LinearLayout(baseActivity); LinearLayout wrapper = new LinearLayout(getActivity());
wrapper.setLayoutParams(Utils.MATCH_PARAMS); wrapper.setLayoutParams(Utils.MATCH_PARAMS);
wrapper.setGravity(Gravity.CENTER); wrapper.setGravity(Gravity.CENTER);
wrapper.setOrientation(LinearLayout.VERTICAL); wrapper.setOrientation(LinearLayout.VERTICAL);
@ -387,7 +388,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
text.setTextSize(24f); text.setTextSize(24f);
wrapper.addView(text); wrapper.addView(text);
Button retry = new Button(baseActivity); Button retry = new Button(getActivity());
retry.setText(R.string.thread_load_failed_retry); retry.setText(R.string.thread_load_failed_retry);
retry.setLayoutParams(Utils.WRAP_PARAMS); retry.setLayoutParams(Utils.WRAP_PARAMS);
retry.setGravity(Gravity.CENTER); retry.setGravity(Gravity.CENTER);
@ -425,6 +426,16 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
return errorMessage; return errorMessage;
} }
private View getCenteredMessageView(int stringResourceId) {
LinearLayout layout = new LinearLayout(getActivity());
layout.setGravity(Gravity.CENTER);
TextView messageView = new TextView(getActivity());
messageView.setText(getString(stringResourceId));
layout.addView(messageView);
return layout;
}
private static class SkipLogic { private static class SkipLogic {
private final ImageView skip; private final ImageView skip;
private int lastFirstVisibleItem; private int lastFirstVisibleItem;

@ -20,6 +20,8 @@ import android.util.AttributeSet;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import org.floens.chan.utils.Utils;
public class CustomScaleImageView extends SubsamplingScaleImageView { public class CustomScaleImageView extends SubsamplingScaleImageView {
private InitedCallback initCallback; private InitedCallback initCallback;
@ -39,12 +41,33 @@ public class CustomScaleImageView extends SubsamplingScaleImageView {
protected void onImageReady() { protected void onImageReady() {
super.onImageReady(); super.onImageReady();
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (initCallback != null) { if (initCallback != null) {
initCallback.onInit(); initCallback.onInit();
} }
} }
});
}
@Override
protected void onOutOfMemory() {
super.onOutOfMemory();
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (initCallback != null) {
initCallback.onOutOfMemory();
}
}
});
}
public interface InitedCallback { public interface InitedCallback {
public void onInit(); public void onInit();
public void onOutOfMemory();
} }
} }

@ -19,6 +19,7 @@ package org.floens.chan.ui.view;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent; import android.content.Intent;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri; import android.net.Uri;
@ -157,14 +158,14 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
image.setInitCallback(new CustomScaleImageView.InitedCallback() { image.setInitCallback(new CustomScaleImageView.InitedCallback() {
@Override @Override
public void onInit() { public void onInit() {
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
removeAllViews(); removeAllViews();
addView(image); addView(image);
callback.setProgress(false); callback.setProgress(false);
} }
});
@Override
public void onOutOfMemory() {
onOutOfMemoryError();
} }
}); });
} }
@ -212,6 +213,11 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
e.printStackTrace(); e.printStackTrace();
onError(); onError();
return; return;
} catch (OutOfMemoryError e) {
System.gc();
e.printStackTrace();
onOutOfMemoryError();
return;
} }
GifImageView view = new GifImageView(getContext()); GifImageView view = new GifImageView(getContext());
@ -261,7 +267,9 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show();
} }
} else { } else {
videoView = new VideoView(getContext()); Context proxyContext = new NoMusicServiceCommandContext(getContext());
videoView = new VideoView(proxyContext);
videoView.setZOrderOnTop(true); videoView.setZOrderOnTop(true);
videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT)); LayoutParams.MATCH_PARENT));
@ -299,7 +307,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
} }
public void onError() { public void onError() {
Toast.makeText(getContext(), R.string.image_preview_failed, Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), R.string.image_preview_failed, Toast.LENGTH_SHORT).show();
callback.setProgress(false); callback.setProgress(false);
} }
@ -308,6 +316,11 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
callback.setProgress(false); callback.setProgress(false);
} }
public void onOutOfMemoryError() {
Toast.makeText(getContext(), R.string.image_preview_failed_oom, Toast.LENGTH_SHORT).show();
callback.setProgress(false);
}
public void cancelLoad() { public void cancelLoad() {
if (imageRequest != null) { if (imageRequest != null) {
imageRequest.cancel(); imageRequest.cancel();
@ -335,4 +348,19 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
public void onVideoError(File video); public void onVideoError(File video);
} }
public static class NoMusicServiceCommandContext extends ContextWrapper {
public NoMusicServiceCommandContext(Context base) {
super(base);
}
@Override
public void sendBroadcast(Intent intent) {
// Only allow broadcasts when it's not a music service command
// Prevents pause intents from broadcasting
if (!"com.android.music.musicservicecommand".equals(intent.getAction())) {
super.sendBroadcast(intent);
}
}
}
} }

@ -61,6 +61,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="image_play_state">Start / stop playing</string> <string name="image_play_state">Start / stop playing</string>
<string name="image_preview_failed">Failed to show image</string> <string name="image_preview_failed">Failed to show image</string>
<string name="image_preview_failed_oom">Failed to show image, out of memory</string>
<string name="image_not_found">Image not found</string> <string name="image_not_found">Image not found</string>
<string name="image_open_failed">Failed to open image</string> <string name="image_open_failed">Failed to open image</string>
@ -71,6 +72,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="thread_load_failed_parsing">Server inaccessible</string> <string name="thread_load_failed_parsing">Server inaccessible</string>
<string name="thread_load_failed_server">404 not found</string> <string name="thread_load_failed_server">404 not found</string>
<string name="thread_load_end_of_line">No more posts</string> <string name="thread_load_end_of_line">No more posts</string>
<string name="thread_not_specified">Select a thread</string>
<string name="thread_refresh_bar_inactive">Tap to refresh</string> <string name="thread_refresh_bar_inactive">Tap to refresh</string>
<string name="thread_refresh_now">Loading</string> <string name="thread_refresh_now">Loading</string>
<string name="thread_refresh_countdown">Loading in %1$d</string> <string name="thread_refresh_countdown">Loading in %1$d</string>

@ -91,9 +91,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<EditTextPreference <EditTextPreference
android:key="preference_default_name" android:key="preference_default_name"
android:title="@string/preference_default_name" /> android:title="@string/preference_default_name" />
<EditTextPreference
android:key="preference_default_email"
android:title="@string/preference_default_email" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="false" android:defaultValue="false"

Loading…
Cancel
Save