Giter VIP home page Giter VIP logo

milktea's Introduction

Milktea


FediverseにMilkteaはいかが?
Misskey, MastodonのAndroidクライアント

説明

MilkteaはMastodonとMisskeyのためのAndroidクライアントアプリケーションです。

目標

Milkteaでは以下のことを達成することを目標とし開発をしました。

  • ソフトウェアの差をできる限り意識させることなくFediverseライフをおくれるようにすること
  • AndroidらしいUIで提供すること
  • 競合サービスから移住してきても違和感なく触れるUIであること
  • 独自機能を追加してより使いやすくすること
  • 継続的な開発ができること
  • Fediverseの存在を意識せずにFediverse lifeをおくれるようにすること

機能

タイムライン

Mastodon, Misskeyから流れてきたタイムラインを、
リアルタイムで表示することができます。

タイムラインタブ機能

よく表示するタイムラインを上部のタブに固定&並び替えをすることができます。
タブ機能は以下のタイムラインの項目を固定することができます。

  • グローバルタイムライン
  • ソーシャルタイムライン
  • ローカルタイムライン
  • ホームタイムライン
  • ユーザーリストタイムライン
  • ユーザーの投稿一覧
  • 検索結果
  • アンテナタイムライン
  • ギャラリー
  • スレッド一覧
  • お気に入り
  • 通知

ノート投稿

Milkteaから投稿を作成することができます。
ファイルのアップロードが非同期で行われるため、
投稿時にファイルアップロードを待つ必要がありません。

リアクションピッカー

ノートにリアクションを付けるときのための機能です。
リアクションピッカーはタブ状にカスタム絵文字、絵文字が分類されています。

  • ユーザー固定
  • よく使うリアクション
  • カテゴリ別(複数)

ノートの下書き機能

Milkteaの独自機能で、
ノートを途中で下書き保存することができます。

ドライブ

Misskeyのドライブのファイルを表示することができます。

ニックネームの上書き

Misskeyでは表記上のニックネームと、
実際にユーザー間の会話で用いられる呼び名が異なることがありました。
表示名と呼び名が異なるのは非常にややこしかったので、
表面的にニックネームを上書き&表示する機能を実装しました。

インストール方法

GooglePlayストアでダウンロード&インストール

利用するインスタンスで事前にアカウントを作成してください。
はじめに インスタンス一覧

インストールが完了したらアプリを起動します。 認可画面が表示されるので、利用しようとしているインスタンスのURLを入力します。
例えばmisskey.ioを利用する場合は、「misskey.io」と入力します。

app nameは自由に設定することがでます。
app nameはインスタンスのバージョンによってはvia名として公開される場合があります。

準備ができれば AUTHENTICATION (認証)を押します。

認証画面がブラウザに表示されるので、問題がなければ許可(Accept)を押します。
もし、リダイレクトしない場合は戻るボタンを押して、「私は許可をしました」を押してください。

成功すればMilkteaにリダイレクトするので[続行(CONTINUE)]を押し完了です。

milktea's People

Contributors

4ioskd avatar ahdg6 avatar dependabot[bot] avatar himbeersaftlp avatar hsdchannel avatar keeakita avatar masayatoy avatar meepuru avatar pantasystem avatar private-yusuke avatar samunohito avatar sanao1006 avatar thatonecalculator avatar xtexchooser avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

milktea's Issues

関わりのあるユーザーを記録する機能

関わりのあるユーザーを記録する機能

タイムラインなどで一度でも表示したことのあるユーザーやコミュニケーションの有無
などの頻度や最近見かけた人などのように記録できるようにすれば面白いのではないか?

この機能を以後 "コミュニケーション"(Communication)と仮称することにする。

また以後Commyという独自名称をつけるかもしれない

"コミュニケーション"の機能

タイムライン等で見かけたユーザーを記録する
リプライやRNなどのコミュニケーションを内訳として記録する
記録は見かけた頻度や見かけた日時、集計などで分類や並び替えできる。
記録の内訳などによって分類、集計することができる。
見かけた場所やきっかけを記録することができる。
表示しているユーザーからユーザーのプロフィールページに移動することができる。
ユーザーをミュート、ブロック、フォロー、アンフォローなどの操作をすることができる。

共通用語

  • ユーザー(User)
  • きっかけ(Cue)
  • 見かけた(Encounter)
  • コミュニケーション(Communication)

共通用語内訳

  • ユーザー
  • きっかけ
    • 内訳
    • きっかけ
  • 見かけた
  • コミュニケーション

タイムライン表示切替が不安定

アカウント切り替え、タブ編集後のタイムライン表示切替が不安定
前に表示していたタイムラインなどが表示されたままだったりする

公開範囲について

MisskeyはAccountにデフォルトの公開範囲を設定できるようになっているが
Milkteaにはそれが適応できないのでデフォルトの後悔範囲を設定しているユーザーを困惑させてしまう可能性がある。

状態管理の実装の問題について

本来Modelで管理すべき状態をViewModelで管理してしまっているため
本来Viewに書かなくていいようなコードがあふれてきてしまっている
現状考えられる対処方法としては
Store & Stateパターン
Repositoryパターン
Entityに状態を持たせ更新イベントなどをFlowなどでViewModelへ伝えViewModelは表示更新のための状態更新を行う
少なくとも状態の管理方法はなるべく抽象化して実装の隠ぺいをしViewModelからDBを使用しているのか
メモリーでキャッシュしているのかを意識させないように実装する必要がある。

確認ダイアログがない

ノート削除時、削除して再編集時に削除の確認ダイアログなしでいきなり削除される。
取り返しのつかない作業をするときは確認ダイアログが表示されるようにすべき。

解決策

ConfirmViewModelとConfirmDialogを作成する
ConfirmViewModelとActivity間はEventBusを利用しEventBusにConfirmEventのような専用の状態を伝えるクラスを使用する。
ConfirmEventにはConfrimTypeなどを持ちそれに基づきActivityが文字リソースを渡しConfrimDialogを表示、コールバックはConfrimEventなどを通じ返す。
コールバックを受けたActivityは処理を代行するViewModelにコマンドを送信して実行する

ユーザーリストを単一Activityにする

現在ユーザーリストはユーザーリスト一覧画面(ListListActivity)とユーザーリスト詳細画面(UserListDetailActivity)に分かれている
がUserListDetailActivityはユーザーリストの状態を変更可能であるためListListActivityと何らかの方法で状態の変化を受け渡しする必要がある。
そこでこの二つの画面を一つのActivityに収めActivityに属するViewModelによって
変更を共有するようにすればいいのではないか?

タイムラインノートを自動的に開放するようにする

見られていないノートをキャプチャーし続けるのはネットワークやメモリなどのリソースが勿体ない。
そこで、ストリームから流れてくる&ユーザーはタイムラインの先頭を表示している場合、
末端ノートを読み込んだ分開放するようにする。
またsinceIdでページネーションを行う場合、現在すでに読み込まれていたページから50件程度前のノートを開放するようにする。

リストをタブに加えた状態表示の不具合

リストをタブ(Page)に加えたのに内部的には変更が適応されているのに
画面上では変更が適応されておらず、さらに重複してタブに同じリストを加えられてしまう。

通知が停止している

通知の実装を間違えているためActivityが停止すると通知も停止してしまう場合がある。
startForegroundを実装する必要がある?・・が他のアプリでは同実装されているのか?

オートロード

ストリーミングAPI復帰条件としてユーザーが明示的にスワイプリフレッシュし件数が20件未満ならストリーミングAPIを読み込む仕組みになっているが
画面表示時に最新のTLを読み込むのと、定期実行で最新のタイムラインを読み込むようにしてはどうか?

下書き機能を実装する

宛先やファイルなどのリストデータをどのように永続化するのか?

宛先やファイルなどのリストとして管理しているデータをどうRDB(SQLite)などでどのように永続化するのか?
解決策として

  • 子テーブルを作成する
  • JSONや独自フォーマットにパースしてしまう
  • 無視をする
    無視をするが一番ローコストであるがUXを著しく下げてしまう
    またORMを使う場合モデルに外部キーを含んでしまったりJSONや独自フォーマットなどを含むインピーダンスミスマッチが生じる可能性がある。
    かといって子テーブルを作成するほど重要なデータとは思えない。
    さらにRealmなどの別のORMや保存機能を導入するという手もあるが、APKのサイズが大きくなり尚且つメンテナンス性がさらに悪化する可能性がある。
    どの道インフラ層がドメイン層に溶け込んでる感が否めないのでもう少しドメインコードとインフラ層を分離することを意識したコードへリファクタリングする必要があるのではないか?

人気のタグを表示しようとすると強制終了する

エラーの内容

E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-11
    Process: jp.panta.misskeyandroidclient, PID: 15589
    java.lang.IllegalStateException: Cannot invoke setValue on a background thread
        at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:462)
        at androidx.lifecycle.LiveData.setValue(LiveData.java:304)
        at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
        at jp.panta.misskeyandroidclient.viewmodel.tags.SortedHashTagListViewModel.load(SortedHashTagListViewModel.kt:64)
        at jp.panta.misskeyandroidclient.viewmodel.tags.SortedHashTagListViewModel$1.invokeSuspend(SortedHashTagListViewModel.kt:58)
        at jp.panta.misskeyandroidclient.viewmodel.tags.SortedHashTagListViewModel$1.invoke(Unknown Source:10)
        at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2.emit(Collect.kt:134)
        at kotlinx.coroutines.flow.FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2.emit(Collect.kt:134)
        at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:342)
    	at kotlinx.corou
I/Process: Sending signal. PID: 15589 SIG: 9

メッセージが表示されない

メッセージ一覧からメッセージに入ってもメッセージが何も表示されない。
また投稿やスクロールしても何も読み込まれることがない。

複数アカウント時の通知の不具合

複数アカウントで利用した場合
関係ない方のアカウントにも通知が表示され、さらに通知バッチが表示される。
その状態で関係ないアカウントで通知画面を表示し通知バッチが非表示になる条件(リロード)をするとなぜか関係ないアカウントでの操作なのに通知バッチが消えてしまう。
この後関係のある方のアカウントで開くと通知バッチは消えたままになっている。

MisskeyのStreamingAPIの仕様変更

NoteのCaptureのtypeがsnからsrに変更されたため、
NoteをCaptureできなくなりました。
鯖のバージョン=version: "12.75.0"

変更前

{
    "type":"sn", "body":{ "id": "noteId" }
}

変更後

{
    "type":"sr", "body":{ "id": "noteId" }
}

ネットワーク切り替え時に強制終了する。

 java.net.ConnectException: Failed to connect to misskey.io/2606:4700:20::681a:1a:443
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:158)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    	at okhttp3.internal.http.RealInterceptorChain.proceed
E/SocketImpl: onFailure, res=null
    java.net.ConnectException: Failed to connect to misskey.io/2606:4700:20::681a:1a:443
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:158)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    	at okhttp3.internal.http.RealInterceptorChain.pro
D/SocketImpl: SocketImpl状態変化: class jp.panta.misskeyandroidclient.streaming.Socket$State$Failure, Failure(throwable=java.net.ConnectException: Failed to connect to misskey.io/2606:4700:20::681a:1a:443, response=null)
E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: jp.panta.misskeyandroidclient, PID: 17911
    java.net.ConnectException: Failed to connect to misskey.io/2606:4700:20::681a:1a:443
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:240)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:158)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    	at okhttp3.internal.http.RealInterceptorChain.proceed(RealIn
        at libcore.io.ForwardingOs.connect(ForwardingOs.java:94)
        at libcore.io.IoBridge.connectErrno(IoBridge.java:173)
        at libcore.io.IoBridge.connect(IoBridge.java:134)
        	... 38 more

簡易エディター投稿

簡易エディターを必要としている人がいる。

UI/UXについて

トップ画面に表示する。
簡易エディターを表示している場合は投稿Fabボタンを表示しない。
さらに簡易エディターの詳細なUIとして一面に入力ボックスと、投稿ボタンを配置する。
さらにエディターの入力ボックスは改行可能とし、ボタンで画像投稿画面、投票、ファイル添付、後悔範囲などの詳細メニューを展開、閉じれるようにする。
下メニューが表示されている場合は下メニューの上に表示する。

問題点

MilkteaはDataBindingを利用したMVVMアーキテクチャを作用しているが、Android固有の仕組みはActivityかBindingAdapterを実装したメソッドを新たに作成する必要があり、ただですら過密なMainActivityがより一層過密になる可能性が考えられる。

Timeline等のページングのリクエストをQueue方式で管理できるようにしたい

今までは読み込み中にページングリクエストがあればキャンセルをし、
そうでなければ新たなページを読み込んでいた。
Misskeyのページングはノート等のIdを基準としたuntilId, sinceIdでリクエストしている。
しかし基準としたノートが削除されていた場合読み込みエラーを起こしてしまう可能性がある。
それらの読み込み状況をQueue方式で管理することができれば、万が一エラーが発生したとき再読み込みの処理をエラーの内容を分析し適した再リクエストをすることができるのではないかと考えた。
さらに良い副作用として、Queue方式で管理することができれば先読み機能などを実装しUXの向上することができる。
問題点としてQueue方式を使用するとLooperを自前で実装するかAndroidのHandlerを利用することになり
テスタブルでなくなってしまうことが考えられる上に、内部実装が複雑になり、不具合を増加させてしまう原因になることが考えられる。

ユーザーリストを表示しようとすると強制終了する

ユーザーリストを表示しようとすると強制終了する。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jp.panta.misskeyandroidclient, PID: 14719
    java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object kotlinx.coroutines.flow.Flow.collect(kotlinx.coroutines.flow.FlowCollector, kotlin.coroutines.Continuation)' on a null object reference
        at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1.collect(SafeCollector.common.kt:114)
        at kotlinx.coroutines.flow.FlowKt__CollectKt.collect(Collect.kt:30)
        at kotlinx.coroutines.flow.FlowKt.collect(Unknown Source:1)
        at kotlinx.coroutines.flow.FlowKt__CollectKt$launchIn$1.invokeSuspend(Collect.kt:50)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:342)
        at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
        at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:27)
I/Process: Sending signal. PID: 14719 SIG: 9

F-Droidへのapkのアップロード

概要

F-Droidにapkをアップロードすることによりダウンロードやアップデートが簡単なものとなり、多くのユーザに使ってもらえるものと思います。やや手続きが面倒なように感じますが……。

要件

  • https://gitlab.com/fdroid/rfp/-/blob/master/README.md#submission-queue にある5つの要件を満たす
  • F-DroidのInclusion Policyを満たす(以下意訳なので参考程度に読んでください)
    • フリーソフトウェア(OSS)であること → GPL-v3
    • 必須条件(Notably)
      • Google Play Servicesを使っていないこと。
      • プロプライエリなトラッキング、分析ツールが依存関係に含まれないこと。
        • Crashlytics、Firebaseなど
      • プロプライエタリな広告ライブラリを使っていないこと。
      • Oracle JDKなどの、Non-Freeなビルドツールを用いないこと。
    • 追加条件(Additionally)
      • 誰にでもアクセス可能なバージョン管理システム(git, Mercurial, Subversion, Bazaarのうちいづれか)で管理されていること(must)。→ GitHubにて公開リポジトリで開発されている
      • 追加の実行可能なバイナリファイルをダウンロードしないこと(should)
        • 例: Non-FreeなAddonや自動更新
      • 一意なAndroid package IDを持っていること(should)。
      • トレードマークを侵害してはならない(must)。また、他の法的要件を遵守しなければならない(must)。
      • Although not ideal, “non-functional” assets (e.g. artwork) may be acceptable under less permissive licenses than functional code - an example would be artwork assets that are licensed only for use with that particular game. In any case though, they must be included under some kind of license, and not be copyright. (原文ママ)
      • F-Droid does not sign up for any API keys. Even if provided by a third party, we include them in both, binary and sourcecode releases. (原文ママ)
      • .jarのようなバイナリの依存関係はsource-built versionsに置換するか trusted repositoryから使用しなければならない(have to)。
    • 理想(Ideally)
      • リリースは明確にタグ付けまたはマークされる必要がある
  • https://gitlab.com/fdroid/rfp/-/issues にRequestを立てる

また、参考リンクにも含めておきましたが、Inclusion How ToはF-Droidに追加されるまでの流れが書いてありますので、F-Droidに申請する場合は一読するべきかと思います。参考までに。

以上、よろしくお願いします。

参考リンク

起動時にネットワークから切断されていると強制終了する

D/SocketImpl: メッセージ送信: {"type":"disconnect","body":{"id":"dcaa9b98-1f35-4a12-b48c-68b029c3f705"}}, stateFailure(throwable=java.net.UnknownHostException: Unable to resolve host "misskey.io": No address associated with hostname, response=null)
D/SocketImpl: 送信をキャンセル state:Failure(throwable=java.net.UnknownHostException: Unable to resolve host "misskey.io": No address associated with hostname, response=null)

URLPreviewの取得方法に問題がある

現状クライアントが個別にスクレイピングでソースサイトからOGなどの情報をもとにURLプレビューを取得しているが、この方法だとMisskeyの特性上ソースサイトに瞬間的に多数の接続が相次ぎ過剰な負荷をかける可能性がある。
またページをまるまる取得するのでバッテリー効率、ネットワークの使用量的にも優しくない。
元々MisskeyにあるURLプレビューを取得するための非公式APIはあるが、仕様変更がかかる可能性があり、実装が組み込みとなってしまうMilkteaでは不向きと考え独自実装したが上記の問題が発覚したため変更する必要がある。

解決策

標準でMisskeyの非公式APIからURLプレビューを取得するようにする。

メリットとしてMilktea利用者以外の接続もあるためキャッシュが豊富にあり独自で実装するより高速なスループットを実現できる。
また非公式APIにキャッシュが実装されていればソースサイトへの負荷も少なくできる。

ユーザーが特定の規格にあったURLプレビュー取得APIを指定できるようにする。

これにより上記の方法が廃止されたり仕様が変更されてもユーザーはアプリをアップデートすることなく引き続き設定を変更するだけで引き続き利用することができる。

既存の機能について

削除はせず上記方法が全てダメになったときの回避策として非推奨機能として残すこととする。

上記3つをユーザーが切り替えられるようにする

上記3つを切り替えられるようにし仕様変更が発生してもアプリをアップデートすることなく引き続き利用できるようにする。

Navigationコンポーネントの導入

Navigationコンポーネントの導入に伴いUI/UXの変更を検討している

BottomNavigationViewとNavigationDrawerが混合してしまっている状態をやめようと思っている。
NavigationDrawerはNavigationDrawerを使用した実装
BottomNavigationはBottomNavigationにふさわしい実装をしたFragmentとして分離したい。

私のインスタンスneko.ciはmilkteaでログインできません。

hello,kinoshita0623
数日前にmilkteaでログインできました。最近、milkteaでサーバーエラーが表示され、ログインできません。この前にドメイン名とサーバーを変更しました。
特にミルクティーを使いたいのですが、解決策はありますか?
都合がよければ、**語の翻訳を投稿できますか?

投稿画面が使いにくい

・メンションを入力するときのサポートが少なすぎる。
・インスタンスで利用できるカスタム絵文字を一覧で見ることができない

FCMを利用したプッシュ通知の実装

FCMを使ってプッシュ通知を実装する。
Misskeyの通知はMisskey API上のregisterを使って
Cloud functionsなどのエンドポイントを登録し、そこで受信した通知をFCMに流すようにする。
Milkteaは複数アカウントに対応しているので、複数アカウントの通知を束ねて一つのアプリに通知する必要がある。

削除して編集をすると強制終了する

E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-7
    Process: jp.panta.misskeyandroidclient, PID: 17197
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = jp.panta.misskeyandroidclient.model.notes.Note)
        at android.os.Parcel.writeSerializable(Parcel.java:1851)
        at android.os.Parcel.writeValue(Parcel.java:1794)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:942)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1613)
        at android.os.Bundle.writeToParcel(Bundle.java:1303)
        at android.os.Parcel.writeBundle(Parcel.java:1011)
        at android.content.Intent.writeToParcel(Intent.java:10804)
        at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3901)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1724)
        at android.app.Activity.startActivityForResult(Activity.java:5263)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
    	at android.app.Activity.startActivityForResul
D/TimelineFragment: onPause
D/NotificationService: プッシュ通知の表示を再開する
I/Process: Sending signal. PID: 17197 SIG: 9

Remote表示がない

Remoteアカウントを表示した場合
RemoteであることとRemoteで表示するボタンが実装されていない。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.