mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-28 20:45:17 +00:00
Remove unused classes (#1289)
This commit is contained in:
parent
9cf99480d6
commit
2f42fe9d0d
@ -1,39 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
|
||||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
|
||||||
import org.session.libsignal.utilities.guava.Optional;
|
|
||||||
|
|
||||||
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview;
|
|
||||||
import org.session.libsession.utilities.Address;
|
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public interface BindableConversationItem extends Unbindable {
|
|
||||||
void bind(@NonNull MessageRecord messageRecord,
|
|
||||||
@NonNull Optional<MessageRecord> previousMessageRecord,
|
|
||||||
@NonNull Optional<MessageRecord> nextMessageRecord,
|
|
||||||
@NonNull GlideRequests glideRequests,
|
|
||||||
@NonNull Locale locale,
|
|
||||||
@NonNull Set<MessageRecord> batchSelected,
|
|
||||||
@NonNull Recipient recipients,
|
|
||||||
@Nullable String searchQuery,
|
|
||||||
boolean pulseHighlight);
|
|
||||||
|
|
||||||
MessageRecord getMessageRecord();
|
|
||||||
|
|
||||||
void setEventListener(@Nullable EventListener listener);
|
|
||||||
|
|
||||||
interface EventListener {
|
|
||||||
void onQuoteClicked(MmsMessageRecord messageRecord);
|
|
||||||
void onLinkPreviewClicked(@NonNull LinkPreview linkPreview);
|
|
||||||
void onMoreTextClicked(@NonNull Address conversationAddress, long messageId, boolean isMms);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,111 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AbsListView;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
|
||||||
import org.thoughtcrime.securesms.contacts.UserView;
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
|
||||||
import org.session.libsession.utilities.Conversions;
|
|
||||||
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
class MessageDetailsRecipientAdapter extends BaseAdapter implements AbsListView.RecyclerListener {
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private final GlideRequests glideRequests;
|
|
||||||
private final MessageRecord record;
|
|
||||||
private final List<RecipientDeliveryStatus> members;
|
|
||||||
private final boolean isPushGroup;
|
|
||||||
|
|
||||||
MessageDetailsRecipientAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests,
|
|
||||||
@NonNull MessageRecord record, @NonNull List<RecipientDeliveryStatus> members,
|
|
||||||
boolean isPushGroup)
|
|
||||||
{
|
|
||||||
this.context = context;
|
|
||||||
this.glideRequests = glideRequests;
|
|
||||||
this.record = record;
|
|
||||||
this.isPushGroup = isPushGroup;
|
|
||||||
this.members = members;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return members.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getItem(int position) {
|
|
||||||
return members.get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
try {
|
|
||||||
return Conversions.byteArrayToLong(MessageDigest.getInstance("SHA1").digest(members.get(position).recipient.getAddress().serialize().getBytes()));
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
|
||||||
UserView result = new UserView(context);
|
|
||||||
Recipient recipient = members.get(position).getRecipient();
|
|
||||||
result.setOpenGroupThreadID(record.getThreadId());
|
|
||||||
result.bind(recipient, glideRequests, UserView.ActionIndicator.None, false);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onMovedToScrapHeap(View view) {
|
|
||||||
((UserView)view).unbind();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static class RecipientDeliveryStatus {
|
|
||||||
|
|
||||||
enum Status {
|
|
||||||
UNKNOWN, PENDING, SENT, DELIVERED, READ
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Recipient recipient;
|
|
||||||
private final Status deliveryStatus;
|
|
||||||
private final boolean isUnidentified;
|
|
||||||
private final long timestamp;
|
|
||||||
|
|
||||||
RecipientDeliveryStatus(Recipient recipient, Status deliveryStatus, boolean isUnidentified, long timestamp) {
|
|
||||||
this.recipient = recipient;
|
|
||||||
this.deliveryStatus = deliveryStatus;
|
|
||||||
this.isUnidentified = isUnidentified;
|
|
||||||
this.timestamp = timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status getDeliveryStatus() {
|
|
||||||
return deliveryStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isUnidentified() {
|
|
||||||
return isUnidentified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTimestamp() {
|
|
||||||
return timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Recipient getRecipient() {
|
|
||||||
return recipient;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms;
|
|
||||||
|
|
||||||
public interface Unbindable {
|
|
||||||
public void unbind();
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components;
|
|
||||||
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.Path;
|
|
||||||
import android.graphics.RectF;
|
|
||||||
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
|
|
||||||
public class Outliner {
|
|
||||||
|
|
||||||
private final float[] radii = new float[8];
|
|
||||||
private final Path corners = new Path();
|
|
||||||
private final RectF bounds = new RectF();
|
|
||||||
private final Paint outlinePaint = new Paint();
|
|
||||||
{
|
|
||||||
outlinePaint.setStyle(Paint.Style.STROKE);
|
|
||||||
outlinePaint.setStrokeWidth(1f);
|
|
||||||
outlinePaint.setAntiAlias(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setColor(@ColorInt int color) {
|
|
||||||
outlinePaint.setColor(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void draw(Canvas canvas) {
|
|
||||||
final float halfStrokeWidth = outlinePaint.getStrokeWidth() / 2;
|
|
||||||
|
|
||||||
bounds.left = halfStrokeWidth;
|
|
||||||
bounds.top = halfStrokeWidth;
|
|
||||||
bounds.right = canvas.getWidth() - halfStrokeWidth;
|
|
||||||
bounds.bottom = canvas.getHeight() - halfStrokeWidth;
|
|
||||||
|
|
||||||
corners.reset();
|
|
||||||
corners.addRoundRect(bounds, radii, Path.Direction.CW);
|
|
||||||
|
|
||||||
canvas.drawPath(corners, outlinePaint);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRadius(int radius) {
|
|
||||||
setRadii(radius, radius, radius, radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRadii(int topLeft, int topRight, int bottomRight, int bottomLeft) {
|
|
||||||
radii[0] = radii[1] = topLeft;
|
|
||||||
radii[2] = radii[3] = topRight;
|
|
||||||
radii[4] = radii[5] = bottomRight;
|
|
||||||
radii[6] = radii[7] = bottomLeft;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components.emoji.parsing;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.AssetManager;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageModel;
|
|
||||||
import org.thoughtcrime.securesms.util.Stopwatch;
|
|
||||||
|
|
||||||
import org.session.libsession.utilities.ListenableFutureTask;
|
|
||||||
import org.session.libsession.utilities.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.lang.ref.SoftReference;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
public class EmojiPageBitmap {
|
|
||||||
|
|
||||||
private static final String TAG = EmojiPageBitmap.class.getSimpleName();
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private final EmojiPageModel model;
|
|
||||||
private final float decodeScale;
|
|
||||||
|
|
||||||
private SoftReference<Bitmap> bitmapReference;
|
|
||||||
private ListenableFutureTask<Bitmap> task;
|
|
||||||
|
|
||||||
public EmojiPageBitmap(@NonNull Context context, @NonNull EmojiPageModel model, float decodeScale) {
|
|
||||||
this.context = context.getApplicationContext();
|
|
||||||
this.model = model;
|
|
||||||
this.decodeScale = decodeScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
|
||||||
public ListenableFutureTask<Bitmap> get() {
|
|
||||||
Util.assertMainThread();
|
|
||||||
|
|
||||||
if (bitmapReference != null && bitmapReference.get() != null) {
|
|
||||||
return new ListenableFutureTask<>(bitmapReference.get());
|
|
||||||
} else if (task != null) {
|
|
||||||
return task;
|
|
||||||
} else {
|
|
||||||
Callable<Bitmap> callable = () -> {
|
|
||||||
try {
|
|
||||||
Log.i(TAG, "loading page " + model.getSpriteUri().toString());
|
|
||||||
return loadPage();
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
Log.w(TAG, ioe);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
task = new ListenableFutureTask<>(callable);
|
|
||||||
new AsyncTask<Void, Void, Void>() {
|
|
||||||
@Override protected Void doInBackground(Void... params) {
|
|
||||||
task.run();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override protected void onPostExecute(Void aVoid) {
|
|
||||||
task = null;
|
|
||||||
}
|
|
||||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
|
||||||
}
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bitmap loadPage() throws IOException {
|
|
||||||
if (bitmapReference != null && bitmapReference.get() != null) return bitmapReference.get();
|
|
||||||
|
|
||||||
|
|
||||||
float scale = decodeScale;
|
|
||||||
AssetManager assetManager = context.getAssets();
|
|
||||||
InputStream assetStream = assetManager.open(model.getSpriteUri().toString());
|
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
|
||||||
|
|
||||||
if (org.thoughtcrime.securesms.util.Util.isLowMemory(context)) {
|
|
||||||
Log.i(TAG, "Low memory detected. Changing sample size.");
|
|
||||||
options.inSampleSize = 2;
|
|
||||||
scale = decodeScale * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
Stopwatch stopwatch = new Stopwatch(model.getSpriteUri().toString());
|
|
||||||
Bitmap bitmap = BitmapFactory.decodeStream(assetStream, null, options);
|
|
||||||
stopwatch.split("decode");
|
|
||||||
|
|
||||||
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth() * scale), (int)(bitmap.getHeight() * scale), true);
|
|
||||||
stopwatch.split("scale");
|
|
||||||
stopwatch.stop(TAG);
|
|
||||||
|
|
||||||
bitmapReference = new SoftReference<>(scaledBitmap);
|
|
||||||
Log.i(TAG, "onPageLoaded(" + model.getSpriteUri().toString() + ") originalByteCount: " + bitmap.getByteCount()
|
|
||||||
+ " scaledByteCount: " + scaledBitmap.getByteCount()
|
|
||||||
+ " scaledSize: " + scaledBitmap.getWidth() + "x" + scaledBitmap.getHeight());
|
|
||||||
return scaledBitmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull String toString() {
|
|
||||||
return model.getSpriteUri().toString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components.recyclerview;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.LinearSmoothScroller;
|
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
|
|
||||||
public class SmoothScrollingLinearLayoutManager extends LinearLayoutManager {
|
|
||||||
|
|
||||||
public SmoothScrollingLinearLayoutManager(Context context, boolean reverseLayout) {
|
|
||||||
super(context, LinearLayoutManager.VERTICAL, reverseLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void smoothScrollToPosition(@NonNull Context context, int position, float millisecondsPerInch) {
|
|
||||||
final LinearSmoothScroller scroller = new LinearSmoothScroller(context) {
|
|
||||||
@Override
|
|
||||||
protected int getVerticalSnapPreference() {
|
|
||||||
return LinearSmoothScroller.SNAP_TO_END;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
|
|
||||||
return millisecondsPerInch / displayMetrics.densityDpi;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
scroller.setTargetPosition(position);
|
|
||||||
startSmoothScroll(scroller);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.database;
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class FastCursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder, T>
|
|
||||||
extends CursorRecyclerViewAdapter<VH>
|
|
||||||
{
|
|
||||||
private static final String TAG = FastCursorRecyclerViewAdapter.class.getSimpleName();
|
|
||||||
|
|
||||||
private final LinkedList<T> fastRecords = new LinkedList<>();
|
|
||||||
private final List<Long> releasedRecordIds = new LinkedList<>();
|
|
||||||
|
|
||||||
protected FastCursorRecyclerViewAdapter(Context context, Cursor cursor) {
|
|
||||||
super(context, cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addFastRecord(@NonNull T record) {
|
|
||||||
fastRecords.addFirst(record);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void releaseFastRecord(long id) {
|
|
||||||
synchronized (releasedRecordIds) {
|
|
||||||
releasedRecordIds.add(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void cleanFastRecords() {
|
|
||||||
synchronized (releasedRecordIds) {
|
|
||||||
Iterator<Long> releaseIdIterator = releasedRecordIds.iterator();
|
|
||||||
|
|
||||||
while (releaseIdIterator.hasNext()) {
|
|
||||||
long releasedId = releaseIdIterator.next();
|
|
||||||
Iterator<T> fastRecordIterator = fastRecords.iterator();
|
|
||||||
|
|
||||||
while (fastRecordIterator.hasNext()) {
|
|
||||||
if (isRecordForId(fastRecordIterator.next(), releasedId)) {
|
|
||||||
fastRecordIterator.remove();
|
|
||||||
releaseIdIterator.remove();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract T getRecordFromCursor(@NonNull Cursor cursor);
|
|
||||||
protected abstract void onBindItemViewHolder(VH viewHolder, @NonNull T record);
|
|
||||||
protected abstract long getItemId(@NonNull T record);
|
|
||||||
protected abstract int getItemViewType(@NonNull T record);
|
|
||||||
protected abstract boolean isRecordForId(@NonNull T record, long id);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemViewType(@NonNull Cursor cursor) {
|
|
||||||
T record = getRecordFromCursor(cursor);
|
|
||||||
return getItemViewType(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindItemViewHolder(VH viewHolder, @NonNull Cursor cursor) {
|
|
||||||
T record = getRecordFromCursor(cursor);
|
|
||||||
onBindItemViewHolder(viewHolder, record);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindFastAccessItemViewHolder(VH viewHolder, int position) {
|
|
||||||
int calculatedPosition = getCalculatedPosition(position);
|
|
||||||
onBindItemViewHolder(viewHolder, fastRecords.get(calculatedPosition));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getFastAccessSize() {
|
|
||||||
return fastRecords.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected T getRecordForPositionOrThrow(int position) {
|
|
||||||
if (isFastAccessPosition(position)) {
|
|
||||||
return fastRecords.get(getCalculatedPosition(position));
|
|
||||||
} else {
|
|
||||||
Cursor cursor = getCursorAtPositionOrThrow(position);
|
|
||||||
return getRecordFromCursor(cursor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getFastAccessItemViewType(int position) {
|
|
||||||
return getItemViewType(fastRecords.get(getCalculatedPosition(position)));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isFastAccessPosition(int position) {
|
|
||||||
position = getCalculatedPosition(position);
|
|
||||||
return position >= 0 && position < fastRecords.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected long getFastAccessItemId(int position) {
|
|
||||||
return getItemId(fastRecords.get(getCalculatedPosition(position)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getCalculatedPosition(int position) {
|
|
||||||
return hasHeaderView() ? position - 1 : position;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.preferences.widgets;
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
|
||||||
|
|
||||||
public class ContactPreference extends Preference {
|
|
||||||
|
|
||||||
private ImageView messageButton;
|
|
||||||
|
|
||||||
private Listener listener;
|
|
||||||
private boolean secure;
|
|
||||||
|
|
||||||
public ContactPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContactPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContactPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContactPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initialize() {
|
|
||||||
setWidgetLayoutResource(R.layout.recipient_preference_contact_widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
|
||||||
super.onBindViewHolder(view);
|
|
||||||
|
|
||||||
this.messageButton = (ImageView) view.findViewById(R.id.message);
|
|
||||||
|
|
||||||
if (listener != null) setListener(listener);
|
|
||||||
setSecure(secure);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSecure(boolean secure) {
|
|
||||||
this.secure = secure;
|
|
||||||
|
|
||||||
int color;
|
|
||||||
|
|
||||||
if (secure) {
|
|
||||||
color = getContext().getResources().getColor(R.color.textsecure_primary);
|
|
||||||
} else {
|
|
||||||
color = getContext().getResources().getColor(R.color.grey_600);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messageButton != null) messageButton.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setListener(Listener listener) {
|
|
||||||
this.listener = listener;
|
|
||||||
|
|
||||||
if (this.messageButton != null) this.messageButton.setOnClickListener(v -> listener.onMessageClicked());
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface Listener {
|
|
||||||
public void onMessageClicked();
|
|
||||||
public void onSecureCallClicked();
|
|
||||||
public void onInSecureCallClicked();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.preferences.widgets
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.widget.FrameLayout
|
|
||||||
|
|
||||||
class NotificationSettingsPreference @JvmOverloads constructor(
|
|
||||||
context: Context, attrs: AttributeSet? = null
|
|
||||||
) : FrameLayout(context, attrs) {
|
|
||||||
|
|
||||||
override fun onFinishInflate() {
|
|
||||||
super.onFinishInflate()
|
|
||||||
// TODO: if we want do the spans
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.preferences.widgets;
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
|
||||||
|
|
||||||
public class ProgressPreference extends Preference {
|
|
||||||
|
|
||||||
private View container;
|
|
||||||
private TextView progressText;
|
|
||||||
|
|
||||||
public ProgressPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProgressPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProgressPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProgressPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initialize() {
|
|
||||||
setWidgetLayoutResource(R.layout.preference_widget_progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
|
||||||
super.onBindViewHolder(view);
|
|
||||||
|
|
||||||
this.container = view.findViewById(R.id.container);
|
|
||||||
this.progressText = (TextView) view.findViewById(R.id.progress_text);
|
|
||||||
|
|
||||||
this.container.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProgress(int count) {
|
|
||||||
container.setVisibility(View.VISIBLE);
|
|
||||||
progressText.setText(getContext().getString(R.string.ProgressPreference_d_messages_so_far, count));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProgressVisible(boolean visible) {
|
|
||||||
container.setVisibility(visible ? View.VISIBLE : View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.reactions.any;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.annimon.stream.Stream;
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.components.emoji.Emoji;
|
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageModel;
|
|
||||||
import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains the Emojis that have been used in reactions for a given message.
|
|
||||||
*/
|
|
||||||
class ThisMessageEmojiPageModel implements EmojiPageModel {
|
|
||||||
|
|
||||||
private final List<String> emoji;
|
|
||||||
|
|
||||||
ThisMessageEmojiPageModel(@NonNull List<String> emoji) {
|
|
||||||
this.emoji = emoji;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getKey() {
|
|
||||||
return RecentEmojiPageModel.KEY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getIconAttr() {
|
|
||||||
return R.attr.emoji_category_recent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull List<String> getEmoji() {
|
|
||||||
return emoji;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull List<Emoji> getDisplayEmoji() {
|
|
||||||
return Stream.of(getEmoji()).map(Emoji::new).toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasSpriteMap() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable Uri getSpriteUri() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isDynamic() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.sms;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.telephony.PhoneStateListener;
|
|
||||||
import android.telephony.ServiceState;
|
|
||||||
import android.telephony.TelephonyManager;
|
|
||||||
|
|
||||||
public class TelephonyServiceState {
|
|
||||||
|
|
||||||
public boolean isConnected(Context context) {
|
|
||||||
ListenThread listenThread = new ListenThread(context);
|
|
||||||
listenThread.start();
|
|
||||||
|
|
||||||
return listenThread.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ListenThread extends Thread {
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
|
|
||||||
private boolean complete;
|
|
||||||
private boolean result;
|
|
||||||
|
|
||||||
public ListenThread(Context context) {
|
|
||||||
this.context = context.getApplicationContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Looper looper = initializeLooper();
|
|
||||||
ListenCallback callback = new ListenCallback(looper);
|
|
||||||
|
|
||||||
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
|
|
||||||
telephonyManager.listen(callback, PhoneStateListener.LISTEN_SERVICE_STATE);
|
|
||||||
|
|
||||||
Looper.loop();
|
|
||||||
|
|
||||||
telephonyManager.listen(callback, PhoneStateListener.LISTEN_NONE);
|
|
||||||
|
|
||||||
set(callback.isConnected());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Looper initializeLooper() {
|
|
||||||
Looper looper = Looper.myLooper();
|
|
||||||
|
|
||||||
if (looper == null) {
|
|
||||||
Looper.prepare();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Looper.myLooper();
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized boolean get() {
|
|
||||||
while (!complete) {
|
|
||||||
try {
|
|
||||||
wait();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void set(boolean result) {
|
|
||||||
this.result = result;
|
|
||||||
this.complete = true;
|
|
||||||
notifyAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ListenCallback extends PhoneStateListener {
|
|
||||||
|
|
||||||
private final Looper looper;
|
|
||||||
private volatile boolean connected;
|
|
||||||
|
|
||||||
public ListenCallback(Looper looper) {
|
|
||||||
this.looper = looper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onServiceStateChanged(ServiceState serviceState) {
|
|
||||||
this.connected = (serviceState.getState() == ServiceState.STATE_IN_SERVICE);
|
|
||||||
looper.quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isConnected() {
|
|
||||||
return connected;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.util
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simplified version of [android.content.ContextWrapper],
|
|
||||||
* but properly supports [startActivityForResult] for the implementations.
|
|
||||||
*/
|
|
||||||
interface ContextProvider {
|
|
||||||
fun getContext(): Context
|
|
||||||
fun startActivityForResult(intent: Intent, requestCode: Int)
|
|
||||||
}
|
|
||||||
|
|
||||||
class ActivityContextProvider(private val activity: Activity): ContextProvider {
|
|
||||||
|
|
||||||
override fun getContext(): Context {
|
|
||||||
return activity
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun startActivityForResult(intent: Intent, requestCode: Int) {
|
|
||||||
activity.startActivityForResult(intent, requestCode)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FragmentContextProvider(private val fragment: Fragment): ContextProvider {
|
|
||||||
|
|
||||||
override fun getContext(): Context {
|
|
||||||
return fragment.requireContext()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun startActivityForResult(intent: Intent, requestCode: Int) {
|
|
||||||
fragment.startActivityForResult(intent, requestCode)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.util;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import android.text.Layout;
|
|
||||||
import android.text.Selection;
|
|
||||||
import android.text.Spannable;
|
|
||||||
import android.text.method.LinkMovementMethod;
|
|
||||||
import android.view.GestureDetector;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
|
||||||
|
|
||||||
public class LongClickMovementMethod extends LinkMovementMethod {
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
|
||||||
private static LongClickMovementMethod sInstance;
|
|
||||||
|
|
||||||
private final GestureDetector gestureDetector;
|
|
||||||
private View widget;
|
|
||||||
private LongClickCopySpan currentSpan;
|
|
||||||
|
|
||||||
private LongClickMovementMethod(final Context context) {
|
|
||||||
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
|
|
||||||
@Override
|
|
||||||
public void onLongPress(MotionEvent e) {
|
|
||||||
if (currentSpan != null && widget != null) {
|
|
||||||
currentSpan.onLongClick(widget);
|
|
||||||
widget = null;
|
|
||||||
currentSpan = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onSingleTapUp(MotionEvent e) {
|
|
||||||
if (currentSpan != null && widget != null) {
|
|
||||||
currentSpan.onClick(widget);
|
|
||||||
widget = null;
|
|
||||||
currentSpan = null;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
|
|
||||||
int action = event.getAction();
|
|
||||||
|
|
||||||
if (action == MotionEvent.ACTION_UP ||
|
|
||||||
action == MotionEvent.ACTION_DOWN) {
|
|
||||||
int x = (int) event.getX();
|
|
||||||
int y = (int) event.getY();
|
|
||||||
|
|
||||||
x -= widget.getTotalPaddingLeft();
|
|
||||||
y -= widget.getTotalPaddingTop();
|
|
||||||
|
|
||||||
x += widget.getScrollX();
|
|
||||||
y += widget.getScrollY();
|
|
||||||
|
|
||||||
Layout layout = widget.getLayout();
|
|
||||||
int line = layout.getLineForVertical(y);
|
|
||||||
int off = layout.getOffsetForHorizontal(line, x);
|
|
||||||
|
|
||||||
LongClickCopySpan longClickCopySpan[] = buffer.getSpans(off, off, LongClickCopySpan.class);
|
|
||||||
if (longClickCopySpan.length != 0) {
|
|
||||||
LongClickCopySpan aSingleSpan = longClickCopySpan[0];
|
|
||||||
if (action == MotionEvent.ACTION_DOWN) {
|
|
||||||
Selection.setSelection(buffer, buffer.getSpanStart(aSingleSpan),
|
|
||||||
buffer.getSpanEnd(aSingleSpan));
|
|
||||||
aSingleSpan.setHighlighted(true,
|
|
||||||
ContextCompat.getColor(widget.getContext(), R.color.touch_highlight));
|
|
||||||
} else {
|
|
||||||
Selection.removeSelection(buffer);
|
|
||||||
aSingleSpan.setHighlighted(false, Color.TRANSPARENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.currentSpan = aSingleSpan;
|
|
||||||
this.widget = widget;
|
|
||||||
return gestureDetector.onTouchEvent(event);
|
|
||||||
}
|
|
||||||
} else if (action == MotionEvent.ACTION_CANCEL) {
|
|
||||||
// Remove Selections.
|
|
||||||
LongClickCopySpan[] spans = buffer.getSpans(Selection.getSelectionStart(buffer),
|
|
||||||
Selection.getSelectionEnd(buffer), LongClickCopySpan.class);
|
|
||||||
for (LongClickCopySpan aSpan : spans) {
|
|
||||||
aSpan.setHighlighted(false, Color.TRANSPARENT);
|
|
||||||
}
|
|
||||||
Selection.removeSelection(buffer);
|
|
||||||
return gestureDetector.onTouchEvent(event);
|
|
||||||
}
|
|
||||||
return super.onTouchEvent(widget, buffer, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static LongClickMovementMethod getInstance(Context context) {
|
|
||||||
if (sInstance == null) {
|
|
||||||
sInstance = new LongClickMovementMethod(context.getApplicationContext());
|
|
||||||
}
|
|
||||||
return sInstance;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.os.PowerManager.WakeLock;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import org.session.libsession.utilities.ServiceUtil;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
|
|
||||||
public class WakeLockUtil {
|
|
||||||
|
|
||||||
private static final String TAG = WakeLockUtil.class.getSimpleName();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param tag will be prefixed with "signal:" if it does not already start with it.
|
|
||||||
*/
|
|
||||||
public static WakeLock acquire(@NonNull Context context, int lockType, long timeout, @NonNull String tag) {
|
|
||||||
tag = prefixTag(tag);
|
|
||||||
try {
|
|
||||||
PowerManager powerManager = ServiceUtil.getPowerManager(context);
|
|
||||||
WakeLock wakeLock = powerManager.newWakeLock(lockType, tag);
|
|
||||||
|
|
||||||
wakeLock.acquire(timeout);
|
|
||||||
Log.d(TAG, "Acquired wakelock with tag: " + tag);
|
|
||||||
|
|
||||||
return wakeLock;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.w(TAG, "Failed to acquire wakelock with tag: " + tag, e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param tag will be prefixed with "signal:" if it does not already start with it.
|
|
||||||
*/
|
|
||||||
public static void release(@NonNull WakeLock wakeLock, @NonNull String tag) {
|
|
||||||
tag = prefixTag(tag);
|
|
||||||
try {
|
|
||||||
if (wakeLock.isHeld()) {
|
|
||||||
wakeLock.release();
|
|
||||||
Log.d(TAG, "Released wakelock with tag: " + tag);
|
|
||||||
} else {
|
|
||||||
Log.d(TAG, "Wakelock wasn't held at time of release: " + tag);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.w(TAG, "Failed to release wakelock with tag: " + tag, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String prefixTag(@NonNull String tag) {
|
|
||||||
return tag.startsWith("signal:") ? tag : "signal:" + tag;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.webrtc
|
|
||||||
|
|
||||||
enum class AudioEvent {
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user