fixed activity unread count

This commit is contained in:
Mariotaku Lee 2015-12-29 20:25:16 +08:00
parent e2c79d7438
commit 0db5471e03
12 changed files with 91 additions and 64 deletions

View File

@ -45,7 +45,7 @@ dependencies {
compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.mariotaku.RestFu:library:0.9.8'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.2'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.3'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.3'
compile fileTree(dir: 'libs', include: ['*.jar'])
}

View File

@ -4,7 +4,7 @@ buildscript {
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
classpath 'io.fabric.tools:gradle:1.21.2'
}
}
import fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask
@ -44,12 +44,14 @@ android {
debug {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm")
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
resValue("bool", "debug", "true")
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd")
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
resValue("bool", "debug", "false")
}
}
sourceSets {
@ -100,7 +102,7 @@ dependencies {
compile 'commons-primitives:commons-primitives:1.0'
compile 'com.bluelinelabs:logansquare:1.3.4'
compile 'org.jraf:android-switch-backport:2.0.1'
compile 'com.github.FasterXML:jackson-jr-trees:5baf62567e'
compile 'com.github.mariotaku:jackson-jr-trees:7fe682ee09'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'

View File

@ -949,7 +949,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
result.put(spec, DataStoreUtils.getStatusesCount(mContext, Statuses.CONTENT_URI, position, accountIds));
break;
}
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
case TAB_TYPE_ACTIVITIES_ABOUT_ME: {
final long[] accountIds = Utils.getAccountIds(spec.args);
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext, true, spec.tag, accountIds);
final long position = mReadStateManager.getPosition(tagWithAccounts);

View File

@ -20,12 +20,14 @@ import android.Manifest;
import android.app.Activity;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.AsyncTask.Status;
import android.os.Build;
@ -890,7 +892,15 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
new SaveFileTask.StringMimeTypeCallback(mimeType)) {
@Override
protected void onFileSaved(File savedFile, String mimeType) {
final Context context = getContext();
if (context == null) return;
if (savedFile != null && savedFile.exists()) {
MediaScannerConnection.scanFile(context, new String[]{savedFile.getPath()},
new String[]{mimeType}, null);
Toast.makeText(context, R.string.saved_to_gallery, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, R.string.error_occurred, Toast.LENGTH_SHORT).show();
}
}
});
}
@ -985,20 +995,6 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasVideo && !isLoading);
MenuUtils.setMenuItemAvailability(menu, R.id.share, hasVideo && !isLoading);
MenuUtils.setMenuItemAvailability(menu, R.id.save, hasVideo && !isLoading);
if (!hasVideo) return;
final MenuItem shareItem = menu.findItem(R.id.share);
final Intent intent = new Intent(Intent.ACTION_SEND);
final Uri fileUri = Uri.fromFile(file);
intent.setDataAndType(fileUri, linkAndType.second);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
final MediaViewerActivity activity = (MediaViewerActivity) getActivity();
if (activity.hasStatus()) {
final ParcelableStatus status = activity.getStatus();
intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status));
intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status));
}
shareItem.setIntent(Intent.createChooser(intent, getString(R.string.share)));
}
@ -1019,6 +1015,21 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
loadVideo(true);
return true;
}
case R.id.share: {
if (mVideoFile == null || mVideoUrlAndType == null) return true;
final Intent intent = new Intent(Intent.ACTION_SEND);
final Uri fileUri = Uri.fromFile(mVideoFile);
intent.setDataAndType(fileUri, mVideoUrlAndType.second);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
final MediaViewerActivity activity = (MediaViewerActivity) getActivity();
if (activity.hasStatus()) {
final ParcelableStatus status = activity.getStatus();
intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status));
intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status));
}
Intent.createChooser(intent, getString(R.string.share));
}
}
return super.onOptionsItemSelected(item);
}

View File

@ -340,7 +340,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
protected abstract void bindTitleSummaryViewHolder(ActivityTitleSummaryViewHolder holder, int position);
protected abstract String getActivityAction(int position);
public abstract String getActivityAction(int position);
public abstract long getTimestamp(int position);
@Override
public boolean isMediaPreviewEnabled() {
@ -364,6 +366,10 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
notifyDataSetChanged();
}
public boolean isActivity(int position) {
return position < getActivityCount();
}
public interface ActivityAdapterListener {
void onGapClick(GapViewHolder holder, int position);

View File

@ -21,7 +21,9 @@ package org.mariotaku.twidere.adapter;
import android.content.Context;
import org.mariotaku.library.objectcursor.ObjectCursor;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
import java.util.List;
@ -46,10 +48,23 @@ public class ParcelableActivitiesAdapter extends AbsActivitiesAdapter<List<Parce
@Override
protected String getActivityAction(int position) {
public String getActivityAction(int position) {
if (mData instanceof ObjectCursor) {
final ParcelableActivityCursorIndices indices = (ParcelableActivityCursorIndices) ((ObjectCursor) mData).getIndices();
return ((ObjectCursor) mData).getCursor(position).getString(indices.action);
}
return mData.get(position).action;
}
@Override
public long getTimestamp(int position) {
if (mData instanceof ObjectCursor) {
final ParcelableActivityCursorIndices indices = (ParcelableActivityCursorIndices) ((ObjectCursor) mData).getIndices();
return ((ObjectCursor) mData).getCursor(position).getLong(indices.timestamp);
}
return mData.get(position).timestamp;
}
@Override
public ParcelableActivity getActivity(int position) {
if (position == getActivityCount()) return null;

View File

@ -23,7 +23,7 @@ import android.util.Log;
import com.bluelinelabs.logansquare.LoganSquare;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.simple.tree.SimpleTreeCodec;
import com.fasterxml.jackson.jr.tree.JacksonJrSimpleTreeCodec;
import org.mariotaku.restfu.callback.RawCallback;
import org.mariotaku.restfu.http.RestHttpResponse;
@ -56,7 +56,7 @@ public abstract class UserStreamCallback implements RawCallback {
onException(cause);
return;
}
final SimpleTreeCodec mapper = new SimpleTreeCodec();
final JacksonJrSimpleTreeCodec mapper = new JacksonJrSimpleTreeCodec();
final CRLFLineReader reader = new CRLFLineReader(new InputStreamReader(response.getBody().stream(), "UTF-8"));
try {
for (String line; (line = reader.readLine()) != null && !disconnected; ) {

View File

@ -183,7 +183,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants
private void initBugReport() {
final SharedPreferences preferences = getSharedPreferences();
if (!preferences.getBoolean(KEY_BUG_REPORTS, true)) return;
if (!preferences.getBoolean(KEY_BUG_REPORTS, BuildConfig.DEBUG)) return;
BugReporter.setImplementation(new TwidereBugReporter());
BugReporter.init(this);
}

View File

@ -43,7 +43,6 @@ import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia;
@ -61,8 +60,10 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.model.MediaEvent;
@ -76,7 +77,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() {
public List<ScrollRecord> mRecords;
private long mFirstVisibleId = -1, mFirstVisibleAccountId = -1;
private long mFirstVisibleTimestamp = -1, mFirstVisibleAccountId = -1;
private int mFirstVisiblePosition = -1;
private int mScrollState;
@ -89,15 +90,15 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
final AbsActivitiesAdapter<Data> adapter = (AbsActivitiesAdapter<Data>) recyclerView.getAdapter();
final ParcelableActivity activity = adapter.getActivity(firstVisiblePosition);
if (activity != null) {
// final long id = activity.id, accountId = activity.account_id;
// if (id != mFirstVisibleId || accountId != mFirstVisibleAccountId) {
// if (mRecords == null) mRecords = new ArrayList<>();
// final long time = System.currentTimeMillis();
// mRecords.add(ScrollRecord.create(id, accountId, time,
// TimeZone.getDefault().getOffset(time), mScrollState));
// }
// mFirstVisibleId = id;
// mFirstVisibleAccountId = accountId;
final long timestamp = activity.timestamp, accountId = activity.account_id;
if (timestamp != mFirstVisibleTimestamp || accountId != mFirstVisibleAccountId) {
if (mRecords == null) mRecords = new ArrayList<>();
final long time = System.currentTimeMillis();
mRecords.add(ScrollRecord.create(timestamp, accountId, time,
TimeZone.getDefault().getOffset(time), mScrollState));
}
mFirstVisibleTimestamp = timestamp;
mFirstVisibleAccountId = accountId;
}
}
mFirstVisiblePosition = firstVisiblePosition;
@ -256,7 +257,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
lastVisiblePos = layoutManager.findFirstVisibleItemPosition();
}
if (lastVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos < adapter.getItemCount()) {
// lastReadId = adapter.getStatusId(lastVisiblePos);
lastReadId = adapter.getTimestamp(lastVisiblePos);
final View positionView = layoutManager.findViewByPosition(lastVisiblePos);
lastVisibleTop = positionView != null ? positionView.getTop() : 0;
} else if (rememberPosition && tag != null) {
@ -271,20 +272,20 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
if (!(loader instanceof IExtendedLoader) || ((IExtendedLoader) loader).isFromUser()) {
adapter.setLoadMoreSupported(hasMoreData(data));
int pos = -1;
// for (int i = 0, j = adapter.getItemCount(); i < j; i++) {
// if (lastReadId != -1 && lastReadId == adapter.getStatusId(i)) {
// pos = i;
// break;
// }
// }
// if (pos != -1 && adapter.isStatus(pos) && (readFromBottom || lastVisiblePos != 0)) {
// if (layoutManager.getHeight() == 0) {
// // RecyclerView has not currently laid out, ignore padding.
// layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop);
// } else {
// layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - layoutManager.getPaddingTop());
// }
// }
for (int i = 0, j = adapter.getItemCount(); i < j; i++) {
if (lastReadId != -1 && lastReadId == adapter.getTimestamp(i)) {
pos = i;
break;
}
}
if (pos != -1 && adapter.isActivity(pos) && (readFromBottom || lastVisiblePos != 0)) {
if (layoutManager.getHeight() == 0) {
// RecyclerView has not currently laid out, ignore padding.
layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop);
} else {
layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - layoutManager.getPaddingTop());
}
}
}
if (loader instanceof IExtendedLoader) {
((IExtendedLoader) loader).setFromUser(false);

View File

@ -176,18 +176,11 @@ public class CustomTabUtils implements Constants {
@Nullable
private static String getTagByType(@NonNull String tabType) {
switch (getTabTypeAlias(tabType)) {
case TAB_TYPE_HOME_TIMELINE: {
return TAB_TYPE_HOME_TIMELINE;
}
case "mentions_timeline": {
return "mentions_timeline";
}
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
return TAB_TYPE_NOTIFICATIONS_TIMELINE;
}
case TAB_TYPE_DIRECT_MESSAGES: {
return TAB_TYPE_DIRECT_MESSAGES;
}
case TAB_TYPE_HOME_TIMELINE:
case TAB_TYPE_NOTIFICATIONS_TIMELINE:
case TAB_TYPE_ACTIVITIES_ABOUT_ME:
case TAB_TYPE_DIRECT_MESSAGES:
return tabType;
}
return null;
}

View File

@ -49,7 +49,6 @@ public class TwidereBugReporter extends BugReporter implements Constants {
if (BuildConfig.DEBUG) {
Log.w(LOGTAG, message, throwable);
}
handleSilentException(new Exception(message, throwable));
return;
}

View File

@ -28,7 +28,7 @@
android:title="@string/usage_statistics"/>
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
android:defaultValue="true"
android:defaultValue="@bool/debug"
android:key="bug_reports"
android:order="12"
android:summary="@string/bug_reports_summary"