├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── debug │ ├── app-debug.apk │ └── output.json ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── help.html │ ├── help_html_89002ae28cf7fb05.png │ ├── help_html_9ad1d430752ebf6.png │ ├── help_html_ac6a09b25fff3ee1.png │ └── help_html_cc549614ddf54317.jpg │ ├── java │ └── cool │ │ └── mixi │ │ └── dica │ │ ├── App.kt │ │ ├── activity │ │ ├── BaseActivity.kt │ │ ├── HelpActivity.kt │ │ ├── IndexActivity.kt │ │ ├── LoginActivity.kt │ │ ├── SearchActivity.kt │ │ ├── StatusActivity.kt │ │ ├── StickerActivity.kt │ │ └── UserActivity.kt │ │ ├── adapter │ │ ├── FriendicaServerListAdapter.kt │ │ ├── IndexPageAdapter.kt │ │ ├── NotificationAdapter.kt │ │ ├── PhotoViewerAdapter.kt │ │ ├── StatusesAdapter.kt │ │ └── UsersAdapter.kt │ │ ├── bean │ │ ├── AP.kt │ │ ├── Attachment.kt │ │ ├── Consts.kt │ │ ├── FriendicaActivities.kt │ │ ├── Geo.kt │ │ ├── Group.kt │ │ ├── HashTag.kt │ │ ├── Media.kt │ │ ├── Meta.kt │ │ ├── Notification.kt │ │ ├── Photo.kt │ │ ├── Profile.kt │ │ ├── Status.kt │ │ ├── User.kt │ │ ├── WebFinger.kt │ │ └── WebFingerLink.kt │ │ ├── database │ │ ├── AppDatabase.kt │ │ └── dao │ │ │ ├── HashTagDao.kt │ │ │ ├── MetaDao.kt │ │ │ └── UserDao.kt │ │ ├── fragment │ │ ├── BaseDialogFragment.kt │ │ ├── ComposeDialogFragment.kt │ │ ├── FriendicaServerListDialog.kt │ │ ├── NotificationDialog.kt │ │ ├── PhotoProcessFragment.kt │ │ ├── PhotoViewerFragment.kt │ │ ├── TimelineFavoritesFragment.kt │ │ ├── TimelineFragment.kt │ │ ├── TimelineFriendsFragment.kt │ │ ├── TimelineMyFragment.kt │ │ ├── TimelineNetworkFragment.kt │ │ ├── TimelinePublicFragment.kt │ │ └── UsersDialog.kt │ │ ├── service │ │ └── NotificationJonService.kt │ │ ├── util │ │ ├── ApiService.kt │ │ ├── DiCaUtil.kt │ │ ├── Ext.kt │ │ ├── FriendicaUtil.kt │ │ ├── HtmlCrawler.kt │ │ ├── LocationUtil.kt │ │ ├── NetworkUtil.kt │ │ ├── PrefUtil.kt │ │ ├── StatusTimeline.kt │ │ └── TimestampConverter.kt │ │ └── view │ │ ├── HackViewPager.kt │ │ ├── MyQuoteSpan.kt │ │ ├── MySocialEditTextView.kt │ │ ├── MyWebView.kt │ │ ├── RecyclingRoundSpan.kt │ │ ├── RoundedBackgroundSpan.java │ │ └── WebImageSpan.kt │ └── res │ ├── drawable-anydpi │ ├── action_comment.xml │ ├── action_favourite.xml │ ├── action_like.xml │ ├── action_menu.xml │ ├── action_unfavourite.xml │ ├── action_unlike.xml │ ├── dialog_album.xml │ ├── dialog_album_white.xml │ ├── dialog_camera_white.xml │ ├── dialog_gps.xml │ ├── dialog_gps_white.xml │ ├── dialog_photo.xml │ ├── dialog_private.xml │ ├── dialog_private_white.xml │ ├── dialog_public.xml │ ├── dialog_public_white.xml │ ├── dialog_smiley.xml │ ├── dialog_smiley_white.xml │ ├── dialog_submit.xml │ ├── dialog_submit_white.xml │ ├── notification_icon.xml │ ├── photo_crop.xml │ ├── photo_reset.xml │ ├── photo_rotate.xml │ ├── retweet.xml │ ├── status_delete.xml │ ├── user_desc.xml │ ├── user_name.xml │ └── user_sitename.xml │ ├── drawable-hdpi │ ├── action_comment.png │ ├── action_favourite.png │ ├── action_like.png │ ├── action_menu.png │ ├── action_unfavourite.png │ ├── action_unlike.png │ ├── dialog_album.png │ ├── dialog_album_white.png │ ├── dialog_camera_white.png │ ├── dialog_gps.png │ ├── dialog_gps_white.png │ ├── dialog_photo.png │ ├── dialog_private.png │ ├── dialog_private_white.png │ ├── dialog_public.png │ ├── dialog_public_white.png │ ├── dialog_smiley.png │ ├── dialog_smiley_white.png │ ├── dialog_submit.png │ ├── dialog_submit_white.png │ ├── notification_icon.png │ ├── photo_crop.png │ ├── photo_reset.png │ ├── photo_rotate.png │ ├── retweet.png │ ├── status_delete.png │ ├── user_desc.png │ ├── user_name.png │ └── user_sitename.png │ ├── drawable-mdpi │ ├── action_comment.png │ ├── action_favourite.png │ ├── action_like.png │ ├── action_menu.png │ ├── action_unfavourite.png │ ├── action_unlike.png │ ├── dialog_album.png │ ├── dialog_album_white.png │ ├── dialog_camera_white.png │ ├── dialog_gps.png │ ├── dialog_gps_white.png │ ├── dialog_photo.png │ ├── dialog_private.png │ ├── dialog_private_white.png │ ├── dialog_public.png │ ├── dialog_public_white.png │ ├── dialog_smiley.png │ ├── dialog_smiley_white.png │ ├── dialog_submit.png │ ├── dialog_submit_white.png │ ├── notification_icon.png │ ├── photo_crop.png │ ├── photo_reset.png │ ├── photo_rotate.png │ ├── retweet.png │ ├── status_delete.png │ ├── user_desc.png │ ├── user_name.png │ └── user_sitename.png │ ├── drawable-v24 │ └── round_create_black_24dp.png │ ├── drawable-xhdpi │ ├── action_comment.png │ ├── action_favourite.png │ ├── action_like.png │ ├── action_menu.png │ ├── action_unfavourite.png │ ├── action_unlike.png │ ├── dialog_album.png │ ├── dialog_album_white.png │ ├── dialog_camera_white.png │ ├── dialog_gps.png │ ├── dialog_gps_white.png │ ├── dialog_photo.png │ ├── dialog_private.png │ ├── dialog_private_white.png │ ├── dialog_public.png │ ├── dialog_public_white.png │ ├── dialog_smiley.png │ ├── dialog_smiley_white.png │ ├── dialog_submit.png │ ├── dialog_submit_white.png │ ├── notification_icon.png │ ├── photo_crop.png │ ├── photo_reset.png │ ├── photo_rotate.png │ ├── retweet.png │ ├── status_delete.png │ ├── user_desc.png │ ├── user_name.png │ └── user_sitename.png │ ├── drawable-xxhdpi │ ├── action_comment.png │ ├── action_favourite.png │ ├── action_like.png │ ├── action_menu.png │ ├── action_unfavourite.png │ ├── action_unlike.png │ ├── dialog_album.png │ ├── dialog_album_white.png │ ├── dialog_camera_white.png │ ├── dialog_gps.png │ ├── dialog_gps_white.png │ ├── dialog_photo.png │ ├── dialog_private.png │ ├── dialog_private_white.png │ ├── dialog_public.png │ ├── dialog_public_white.png │ ├── dialog_smiley.png │ ├── dialog_smiley_white.png │ ├── dialog_submit.png │ ├── dialog_submit_white.png │ ├── notification_icon.png │ ├── photo_crop.png │ ├── photo_reset.png │ ├── photo_rotate.png │ ├── retweet.png │ ├── status_delete.png │ ├── user_desc.png │ ├── user_name.png │ └── user_sitename.png │ ├── drawable │ ├── comment.png │ ├── dot_default.xml │ ├── dot_selected.xml │ ├── dot_selector.xml │ ├── emoji.png │ ├── favorites.png │ ├── favorites_sel.png │ ├── friend_logo.png │ ├── ic_camera.png │ ├── ic_gallery.png │ ├── ic_gps.png │ ├── ic_launcher.png │ ├── lock.png │ ├── notify_off.png │ ├── notify_on.png │ ├── photo_preview_box.xml │ ├── recycling_status_bg.xml │ ├── reply_bg.xml │ ├── reply_vertical_line.xml │ ├── retweet.png │ ├── round_create_black_24dp.png │ ├── round_photo_camera_black.png │ ├── round_photo_size_select_actual_black.png │ ├── round_reply_black.png │ ├── server_list_icon.png │ ├── share.png │ ├── share_small.png │ ├── status_backgroud_grey.xml │ ├── status_website_bg.xml │ ├── thumb_up.png │ └── thumb_up_sel.png │ ├── layout │ ├── activity_help.xml │ ├── activity_login.xml │ ├── activity_main.xml │ ├── activity_search.xml │ ├── activity_status.xml │ ├── activity_sticker.xml │ ├── activity_user.xml │ ├── box_status_action.xml │ ├── box_status_action_comment.xml │ ├── box_status_user.xml │ ├── box_status_user_in_commit.xml │ ├── box_status_website.xml │ ├── content_help.xml │ ├── dlg_compose.xml │ ├── dlg_friendica_server_list.xml │ ├── dlg_notifications.xml │ ├── dlg_users.xml │ ├── empty_view.xml │ ├── empty_view_user_page.xml │ ├── fg_photo_process.xml │ ├── fg_photoviewer.xml │ ├── fg_photoviewer_item.xml │ ├── fg_timeline.xml │ ├── friendica_server_list_item.xml │ ├── loading_dialog.xml │ ├── notification_item.xml │ ├── reply_list_item.xml │ ├── reply_list_item_level2.xml │ ├── rv_user_item.xml │ ├── rv_user_item_header.xml │ ├── status_list_item.xml │ └── users_list_item.xml │ ├── menu │ ├── index_avatar_menu.xml │ ├── search.xml │ └── status_menu.xml │ ├── values-de │ ├── dimens.xml │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ └── values │ ├── arrays.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | app/release 10 | app/release.keystore 11 | app/build.gradle.release 12 | app/build.gradle.debug 13 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | dica.mixi.cool 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DiCa-MianXian 2 | 3 | This is a very very very simple [Friendica](https://friendi.ca) android client, wrote by Android Kotlin 4 | 5 | ## Naming 6 | 7 | > [DiCa-MianXian](https://scm-assets.constant.co/scm/unilever/e9dc924f238fa6cc29465942875fe8f0/5a4d6ace-5ec5-4034-b327-5b23958a787b.jpg) is a decilious food in Taiwan, that's all 8 | 9 | ## Permission Requirment (Optionals) 10 | 11 | * Camera : If you wanna upload photo; this permission must be granted by you 12 | 13 | * GPS : If you wanna tag your location; this permission must be granted by you 14 | 15 | 16 | ## Feature 17 | 18 | * Enable for all [Friendica](https://friendi.ca) base website 19 | * Support display network public stream: Friendica / Diaspora* / Mastodon 20 | * Dashboard [Public / Public Networks / Friends / My / Favorite timeline] 21 | * Hashtag Search 22 | * Simple user page / status page 23 | * Status post (photo / location tag / group permission) 24 | * Support offline capacity 25 | * Notification 26 | * Like / UnLike 27 | * Favorites 28 | * Retweet 29 | * Sticker 30 | * Mention 31 | 32 | 33 | ### DONATE US 34 | 35 | > [![](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/DiCa/donate) 36 | 37 | 38 | ## DOWNLOAD 39 | 40 | * [Google Play Store](https://play.google.com/store/apps/details?id=cool.mixi.dica) 41 | 42 | * [Google Play Store Beta Tester Program](https://play.google.com/apps/testing/cool.mixi.dica) 43 | 44 | * [GITHUB](https://github.com/jasoncheng/dica/tree/apk/apk) 45 | 46 | ## LINKS 47 | 48 | * [Support Forum](https://meld.de/profile/dica) 49 | 50 | * [CHANGELOG](https://github.com/jasoncheng/dica/wiki/CHANGELOG) 51 | 52 | * [SOURCE](https://github.com/jasoncheng/dica) 53 | 54 | * [Domain](http://dica.mixi.cool) 55 | 56 | ## SCREENSHOT 57 | ![](https://user-images.githubusercontent.com/540463/50288187-1e3b6c00-04a0-11e9-9fbc-74418644a8e0.png) ![](https://user-images.githubusercontent.com/540463/50288186-1e3b6c00-04a0-11e9-9515-76090d1eb6ed.png) ![](https://user-images.githubusercontent.com/540463/50288185-1da2d580-04a0-11e9-949c-f08fbeef2ccf.png) ![](https://user-images.githubusercontent.com/540463/50288184-1da2d580-04a0-11e9-9a86-9ba97ea8ec67.png) ![](https://user-images.githubusercontent.com/540463/50288182-1da2d580-04a0-11e9-849e-2dd4562f5cf6.png) ![](https://user-images.githubusercontent.com/540463/50288181-1da2d580-04a0-11e9-83a3-4d124cb12c1b.png) ![](https://user-images.githubusercontent.com/540463/50288180-1d0a3f00-04a0-11e9-9718-7477c13d5c64.png) ![](https://user-images.githubusercontent.com/540463/50288179-1d0a3f00-04a0-11e9-8074-12f9a14b8788.png) 58 | 59 | ## LICENSE 60 | 61 | DiCa is released under the The GNU General Public License v3.0 (GPLv3) 62 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | 5 | apply plugin: 'kotlin-android-extensions' 6 | 7 | apply plugin: 'kotlin-kapt' 8 | 9 | android { 10 | compileSdkVersion 28 11 | defaultConfig { 12 | applicationId 'cool.mixi.dica' 13 | minSdkVersion 21 14 | targetSdkVersion 28 15 | versionCode 19020501 16 | versionName "0.2.3" 17 | } 18 | signingConfigs { 19 | dica { 20 | keyAlias 'androidreleasekey' 21 | keyPassword '38armani' 22 | storeFile file('./release.keystore') 23 | storePassword '38armani' 24 | } 25 | } 26 | buildTypes { 27 | release { 28 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 29 | signingConfig signingConfigs.dica 30 | zipAlignEnabled true 31 | shrinkResources true 32 | minifyEnabled true 33 | lintOptions { 34 | disable 'MissingTranslation' 35 | checkReleaseBuilds false 36 | abortOnError false 37 | } 38 | } 39 | debug { 40 | signingConfig signingConfigs.dica 41 | } 42 | } 43 | productFlavors { 44 | } 45 | buildToolsVersion '28.0.3' 46 | } 47 | 48 | dependencies { 49 | implementation fileTree(include: ['*.jar'], dir: 'libs') 50 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 51 | implementation 'androidx.appcompat:appcompat:1.0.2' 52 | implementation 'androidx.recyclerview:recyclerview:1.0.0' 53 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 54 | implementation 'com.google.android.material:material:1.1.0-alpha03' 55 | implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3' 56 | implementation 'com.google.android.gms:play-services-location:16.0.0' 57 | implementation 'com.squareup.retrofit2:retrofit:2.4.0' 58 | implementation 'com.squareup.retrofit2:converter-gson:2.4.0' 59 | implementation 'com.squareup.retrofit2:converter-scalars:2.4.0' 60 | implementation 'com.squareup.retrofit2:converter-simplexml:2.3.0' 61 | implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0' 62 | implementation 'com.github.bumptech.glide:glide:4.8.0' 63 | implementation 'com.github.tajchert:nammu:1.2.0' 64 | implementation 'com.github.jkwiecien:EasyImage:2.1.0' 65 | implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' 66 | implementation 'org.jsoup:jsoup:1.11.3' 67 | implementation 'org.jetbrains.anko:anko-commons:0.10.4' 68 | implementation 'com.github.chrisbanes:PhotoView:2.1.3' 69 | implementation 'androidx.room:room-runtime:2.1.0-alpha04' 70 | kapt 'androidx.room:room-compiler:2.1.0-alpha04' 71 | implementation 'com.hendraanggrian.appcompat:socialview:0.1' 72 | implementation 'com.hendraanggrian.appcompat:socialview-commons:0.1' 73 | implementation 'androidx.viewpager:viewpager:1.0.0' 74 | } 75 | -------------------------------------------------------------------------------- /app/debug/app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/debug/app-debug.apk -------------------------------------------------------------------------------- /app/debug/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":19011403,"versionName":"0.2.2","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}] -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -keepattributes Signature, InnerClasses, EnclosingMethod 23 | 24 | # Dica 25 | -keepclassmembers class cool.mixi.dica.bean.** {*;} 26 | -keep class cool.mixi.dica.view.** {*;} 27 | 28 | # Android 29 | -keep class com.google.** 30 | -dontwarn com.google.** 31 | -dontwarn android.support.** 32 | -dontnote android.support.v4.** 33 | -keep class android.support.v4.** { *; } 34 | -dontnote android.support.v7.** 35 | -keep public class android.support.v7.widget.** { *; } 36 | -keep public class android.support.v7.internal.widget.** { *; } 37 | -keep public class android.support.v7.internal.view.menu.** { *; } 38 | -keep public class * extends android.support.v4.view.ActionProvider { 39 | public (android.content.Context); 40 | } 41 | -keep class android.webkit.WebViewClient 42 | -keep class * extends android.webkit.WebViewClient 43 | -keepclassmembers class * extends android.webkit.WebViewClient { 44 | ; 45 | } 46 | 47 | # Glide 48 | -keep public class * implements com.bumptech.glide.module.GlideModule 49 | -keep public class * extends com.bumptech.glide.AppGlideModule 50 | -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 51 | **[] $VALUES; 52 | public *; 53 | } 54 | 55 | # retrofit 56 | -keepclassmembers,allowshrinking,allowobfuscation interface * { 57 | @retrofit2.http.* ; 58 | } 59 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 60 | -dontwarn javax.annotation.** 61 | -dontwarn kotlin.Unit 62 | -dontwarn retrofit2.-KotlinExtensions 63 | -dontwarn okhttp3.** 64 | -dontwarn okio.** 65 | -dontwarn javax.annotation.** 66 | -dontwarn org.conscrypt.** 67 | -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase 68 | 69 | # Jsoup 70 | -keep public class org.jsoup.** { 71 | public *; 72 | } 73 | -keepnames class org.jsoup.nodes.Entities 74 | 75 | # Other 76 | -dontwarn org.kobjects.** 77 | -dontwarn org.ksoap2.** 78 | -dontwarn org.kxml2.** 79 | -dontwarn org.xmlpull.v1.** 80 | 81 | -keep class org.kobjects.** { *; } 82 | -keep class org.ksoap2.** { *; } 83 | -keep class org.kxml2.** { *; } 84 | -keep class org.xmlpull.** { *; } 85 | 86 | -dontusemixedcaseclassnames 87 | -dontskipnonpubliclibraryclasses 88 | -dontoptimize 89 | -dontpreverify 90 | 91 | # Keep public classes and methods. 92 | -dontwarn com.bea.xml.stream.** 93 | -dontwarn org.simpleframework.xml.stream.** 94 | -keep class org.simpleframework.xml.**{ *; } 95 | -keepclassmembers,allowobfuscation class * { 96 | @org.simpleframework.xml.* ; 97 | @org.simpleframework.xml.* (...); 98 | } 99 | -------------------------------------------------------------------------------- /app/src/main/assets/help_html_89002ae28cf7fb05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/assets/help_html_89002ae28cf7fb05.png -------------------------------------------------------------------------------- /app/src/main/assets/help_html_9ad1d430752ebf6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/assets/help_html_9ad1d430752ebf6.png -------------------------------------------------------------------------------- /app/src/main/assets/help_html_ac6a09b25fff3ee1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/assets/help_html_ac6a09b25fff3ee1.png -------------------------------------------------------------------------------- /app/src/main/assets/help_html_cc549614ddf54317.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/assets/help_html_cc549614ddf54317.jpg -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/App.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica 2 | 3 | import android.app.Application 4 | import android.app.NotificationManager 5 | import android.content.Context 6 | import android.widget.Toast 7 | import cool.mixi.dica.bean.* 8 | import cool.mixi.dica.database.AppDatabase 9 | import cool.mixi.dica.util.ApiService 10 | import cool.mixi.dica.util.dLog 11 | import org.jetbrains.anko.doAsync 12 | import pl.aprilapps.easyphotopicker.EasyImage 13 | import retrofit2.Call 14 | import retrofit2.Callback 15 | import retrofit2.Response 16 | import java.util.* 17 | import javax.net.ssl.HttpsURLConnection 18 | import kotlin.collections.ArrayList 19 | import kotlin.collections.HashMap 20 | 21 | class App: Application() { 22 | 23 | var notifications: ArrayList = ArrayList() 24 | var myself: Profile? = null 25 | var mygroup: ArrayList? = null 26 | var selectedGroup: ArrayList = ArrayList() 27 | var webFingerUrlCache: HashMap = HashMap() 28 | var cachedUser: ArrayList = ArrayList() 29 | 30 | var mediaUris: ArrayList = ArrayList() 31 | var serverList: ArrayList = ArrayList() 32 | 33 | companion object { 34 | lateinit var instance: App private set 35 | } 36 | 37 | override fun onCreate() { 38 | super.onCreate() 39 | instance = this 40 | EasyImage.configuration(this).setAllowMultiplePickInGallery(true) 41 | } 42 | 43 | fun getWebFinger(email: String): String? { 44 | webFingerUrlCache[email].let { 45 | dLog("webFinger cached? $email $it") 46 | return it 47 | } 48 | } 49 | 50 | fun setWebFinger(email: String, atomUrl: String){ 51 | dLog("webFinger caching $email $atomUrl") 52 | webFingerUrlCache[email] = atomUrl 53 | } 54 | 55 | fun loadGroup(){ 56 | ApiService.create().friendicaGroupShow().enqueue(object: Callback>{ 57 | override fun onFailure(call: Call>, t: Throwable){} 58 | override fun onResponse(call: Call>, response: Response>) { 59 | if(response.code() != HttpsURLConnection.HTTP_OK || response.body() == null){ 60 | return 61 | } 62 | mygroup = response.body()!! 63 | } 64 | }) 65 | } 66 | 67 | fun toast(message: String) { 68 | Toast.makeText(this, message, Toast.LENGTH_SHORT).show() 69 | } 70 | 71 | fun addUserToDB(statuses: List){ 72 | val userDao = AppDatabase.getInstance().userDao() 73 | val calendar = Calendar.getInstance() 74 | doAsync { 75 | statuses.forEach { 76 | if(cachedUser.contains(it.user)){ 77 | return@forEach 78 | } 79 | var user = it.user 80 | user.updatedAt = calendar.time 81 | cachedUser.add(user) 82 | userDao.upsert(user) 83 | } 84 | } 85 | } 86 | 87 | fun clear(){ 88 | mediaUris.clear() 89 | } 90 | 91 | fun checkIfRequireClearAllNotification(){ 92 | if(getUnSeenNotificationCount() > 0) return 93 | (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).cancelAll() 94 | } 95 | 96 | fun addNotification(data: List){ 97 | notifications.clear() 98 | data.forEach { 99 | notifications.add(it) 100 | } 101 | } 102 | 103 | fun getUnSeenNotificationCount(): Int { 104 | var c = 0 105 | notifications.forEach { 106 | if(it.seen == 0) c++ 107 | } 108 | return c 109 | } 110 | 111 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/activity/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.activity 2 | 3 | import android.content.Intent 4 | import android.content.pm.ActivityInfo 5 | import android.os.Bundle 6 | import android.widget.TextView 7 | import androidx.appcompat.app.AlertDialog 8 | import androidx.appcompat.app.AppCompatActivity 9 | import cool.mixi.dica.R 10 | import cool.mixi.dica.bean.Consts 11 | import cool.mixi.dica.fragment.ComposeDialogFragment 12 | import cool.mixi.dica.util.StatusTimeline 13 | 14 | open class BaseActivity: AppCompatActivity() { 15 | 16 | var stl: StatusTimeline? = null 17 | var alertDialog:AlertDialog? = null 18 | var loadingText: TextView? = null 19 | fun loading(message: String) { 20 | var builder = AlertDialog.Builder(this) 21 | var view = layoutInflater.inflate(R.layout.loading_dialog, null) 22 | loadingText = view.findViewById(R.id.tv_loading) 23 | loadingText?.text = message 24 | builder.setCancelable(true) 25 | builder.setView(view) 26 | alertDialog = builder.show() 27 | } 28 | 29 | open fun loaded(){ 30 | alertDialog?.dismiss() 31 | } 32 | 33 | open fun loadingState(txt: String){ 34 | loadingText?.let { 35 | it.text = txt 36 | } 37 | } 38 | 39 | override fun onCreate(savedInstanceState: Bundle?) { 40 | super.onCreate(savedInstanceState) 41 | requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT 42 | } 43 | 44 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 45 | super.onActivityResult(requestCode, resultCode, data) 46 | getComposeDialog()?.let { 47 | it.onActivityResult(requestCode, resultCode, data) 48 | } 49 | } 50 | 51 | private fun getComposeDialog(): ComposeDialogFragment? { 52 | return supportFragmentManager.findFragmentByTag(Consts.FG_COMPOSE) as ComposeDialogFragment 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/activity/HelpActivity.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.activity 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.webkit.WebView 6 | import com.google.android.material.snackbar.Snackbar 7 | import cool.mixi.dica.R 8 | import kotlinx.android.synthetic.main.activity_help.* 9 | 10 | class HelpActivity : BaseActivity() { 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_help) 14 | setSupportActionBar(toolbar) 15 | 16 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 17 | 18 | setTitle(R.string.menu_help) 19 | 20 | var wv = findViewById(R.id.helpWebView) as WebView 21 | wv.loadUrl("file:///android_asset/help.html") 22 | 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/activity/StickerActivity.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.activity 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.os.Bundle 7 | import android.view.View 8 | import cool.mixi.dica.R 9 | import cool.mixi.dica.bean.Consts 10 | import cool.mixi.dica.util.PrefUtil 11 | import cool.mixi.dica.util.eLog 12 | import cool.mixi.dica.view.IStickerPicker 13 | import kotlinx.android.synthetic.main.activity_sticker.* 14 | 15 | class StickerActivity: BaseActivity(), IStickerPicker { 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | setContentView(R.layout.activity_sticker) 20 | loading() 21 | } 22 | 23 | override fun onDestroy() { 24 | super.onDestroy() 25 | saveLastUrl() 26 | } 27 | 28 | private fun saveLastUrl() { 29 | var uri: Uri? = null 30 | try { 31 | uri = Uri.parse(web?.url) 32 | } catch (e: Exception) { eLog("${e.message}") } 33 | 34 | if (uri?.getQueryParameter("q") == null || uri.getQueryParameter("q") == "null") { 35 | PrefUtil.resetStickerUrl() 36 | return 37 | } 38 | 39 | val searchTerm = "q=" + uri.getQueryParameter("q") + 40 | "&tbm=" + uri.getQueryParameter("tbm") + 41 | "&tbs=" + uri.getQueryParameter("tbs") 42 | PrefUtil.setStickerUrl(searchTerm) 43 | } 44 | 45 | fun loading(){ 46 | pb.visibility = View.VISIBLE 47 | } 48 | 49 | override fun loaded(){ 50 | pb.visibility = View.GONE 51 | } 52 | 53 | override fun stickerSelected(url: String) { 54 | var i = Intent() 55 | i.putExtra(Consts.EXTRA_STICKER_URI, url) 56 | setResult(Activity.RESULT_OK, i) 57 | finish() 58 | } 59 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/adapter/FriendicaServerListAdapter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.adapter 2 | 3 | import android.content.Intent 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import cool.mixi.dica.App 9 | import cool.mixi.dica.R 10 | import cool.mixi.dica.activity.LoginActivity 11 | import cool.mixi.dica.bean.Consts 12 | import cool.mixi.dica.fragment.FriendicaServerListDialog 13 | import kotlinx.android.synthetic.main.friendica_server_list_item.view.* 14 | import java.net.URL 15 | 16 | class FriendicaServerListAdapter(private val fragment: FriendicaServerListDialog) 17 | : androidx.recyclerview.widget.RecyclerView.Adapter() { 18 | 19 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ServerListHolder { 20 | var view = LayoutInflater.from(fragment.context).inflate(R.layout.friendica_server_list_item, parent, false) 21 | view.setOnClickListener { setServerLink(it) } 22 | return ServerListHolder(view) 23 | } 24 | 25 | override fun getItemCount(): Int { 26 | return App.instance.serverList.size 27 | } 28 | 29 | override fun onBindViewHolder(holder: ServerListHolder, position: Int) { 30 | var meta = App.instance.serverList[position] 31 | var host = meta.url 32 | try { 33 | host = URL(meta.url).host 34 | }catch (e: Exception){} 35 | holder.itemView.tag = position 36 | holder.serverUrl.text = host 37 | meta.description.isNullOrEmpty()?.let { 38 | if(it){ 39 | holder.serverDesc.visibility = View.GONE 40 | } else { 41 | holder.serverDesc.visibility = View.VISIBLE 42 | holder.serverDesc.text = meta.description 43 | } 44 | } 45 | } 46 | 47 | private fun setServerLink(view: View) { 48 | var position = view.tag as Int 49 | val meta = App.instance.serverList[position] 50 | (fragment.activity as LoginActivity).setServerLink(meta.url) 51 | if(fragment.registrationMode){ 52 | fragment.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("${meta.url}${Consts.FRIENDICA_REGISTER_PATH}"))) 53 | } 54 | fragment.dismissAllowingStateLoss() 55 | } 56 | 57 | } 58 | 59 | open class ServerListHolder(view: View): androidx.recyclerview.widget.RecyclerView.ViewHolder(view) { 60 | var serverUrl = view.tv_server_url!! 61 | var serverDesc = view.tv_server_description!! 62 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/adapter/IndexPageAdapter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.adapter 2 | 3 | import android.view.ViewGroup 4 | import cool.mixi.dica.R 5 | import cool.mixi.dica.activity.IndexActivity 6 | import cool.mixi.dica.fragment.* 7 | import java.util.* 8 | 9 | class IndexPageAdapter(val activity: IndexActivity, fragmentManager: androidx.fragment.app.FragmentManager): androidx.fragment.app.FragmentPagerAdapter(fragmentManager){ 10 | 11 | private val names = activity.resources.getStringArray(R.array.index_tab) 12 | private var pagers: WeakHashMap = WeakHashMap() 13 | 14 | override fun getItem(position: Int): androidx.fragment.app.Fragment { 15 | val fg = when(position) { 16 | 0 -> TimelineFriendsFragment() 17 | 1 -> TimelinePublicFragment() 18 | 2 -> TimelineNetworkFragment() 19 | 3 -> TimelineMyFragment() 20 | else -> TimelineFavoritesFragment() 21 | } 22 | pagers[position] = fg 23 | return fg 24 | } 25 | 26 | override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { 27 | super.destroyItem(container, position, `object`) 28 | pagers.remove(position) 29 | } 30 | 31 | override fun getCount(): Int { 32 | return names.size 33 | } 34 | 35 | fun getTimelineFragment(pos: Int): TimelineFragment?{ 36 | return pagers[pos] 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/adapter/NotificationAdapter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.adapter 2 | 3 | import android.content.Intent 4 | import android.graphics.Color 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.bumptech.glide.Glide 9 | import com.bumptech.glide.request.RequestOptions 10 | import cool.mixi.dica.App 11 | import cool.mixi.dica.R 12 | import cool.mixi.dica.activity.StatusActivity 13 | import cool.mixi.dica.activity.UserActivity 14 | import cool.mixi.dica.bean.Consts 15 | import cool.mixi.dica.fragment.NotificationDialog 16 | import cool.mixi.dica.util.FriendicaUtil 17 | import kotlinx.android.synthetic.main.notification_item.view.* 18 | 19 | class NotificationAdapter(private val fragment: NotificationDialog) 20 | : androidx.recyclerview.widget.RecyclerView.Adapter() { 21 | 22 | private val unReadColor = fragment.resources.getColor(R.color.notification_unread) 23 | 24 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotifyViewHolder { 25 | var view = LayoutInflater.from(fragment.context).inflate(R.layout.notification_item, parent, false) 26 | 27 | view.setOnClickListener { goToStatusPage(it) } 28 | 29 | return NotifyViewHolder(view) 30 | } 31 | 32 | override fun getItemCount(): Int { 33 | return App.instance.notifications.size 34 | } 35 | 36 | override fun onBindViewHolder(holder: NotifyViewHolder, position: Int) { 37 | var notification = App.instance.notifications?.get(position) 38 | holder.itemView.tag = position 39 | if(notification?.seen == 1) { 40 | holder.itemView.setBackgroundColor(Color.TRANSPARENT) 41 | } else { 42 | holder.itemView.setBackgroundColor(unReadColor) 43 | } 44 | holder.msg.text = notification?.msg_plain 45 | holder.date.text = notification?.date_rel 46 | Glide.with(App.instance.applicationContext) 47 | .load(notification?.photo) 48 | .apply(RequestOptions().circleCrop()) 49 | .into(holder.avatar!!) 50 | } 51 | 52 | private fun goToStatusPage(view: View) { 53 | val pos = view.tag as? Int ?: return 54 | val notification = App.instance.notifications[pos] 55 | when { 56 | notification.otype == Consts.OTYPE_ITEM -> { 57 | val intent = Intent(fragment.context, StatusActivity::class.java) 58 | intent.putExtra(Consts.ID_STATUS, notification.parent) 59 | fragment.startActivity(intent) 60 | } 61 | notification.otype == Consts.OTYPE_INTRO -> { 62 | val intent = Intent(fragment.context, UserActivity::class.java) 63 | intent.putExtra(Consts.EXTRA_USER_NAME, notification.name) 64 | fragment.startActivity(intent) 65 | } 66 | else -> App.instance.toast(fragment.getString(R.string.not_implement_yet)) 67 | } 68 | 69 | FriendicaUtil.seen(notification.id, null) 70 | notification.seen = 1 71 | notifyItemChanged(pos) 72 | App.instance.checkIfRequireClearAllNotification() 73 | } 74 | } 75 | 76 | open class NotifyViewHolder(view: View): androidx.recyclerview.widget.RecyclerView.ViewHolder(view) { 77 | var msg = view.tv_message 78 | var date = view.tv_datetime 79 | var avatar = view.avatar 80 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/adapter/PhotoViewerAdapter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.adapter 2 | 3 | import androidx.viewpager.widget.PagerAdapter 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import com.bumptech.glide.Glide 8 | import cool.mixi.dica.App 9 | import cool.mixi.dica.R 10 | import cool.mixi.dica.fragment.PhotoViewerFragment 11 | import kotlinx.android.synthetic.main.fg_photoviewer_item.view.* 12 | import java.lang.ref.WeakReference 13 | 14 | class PhotoViewerAdapter(val data: ArrayList, private val ref: WeakReference): androidx.viewpager.widget.PagerAdapter() { 15 | 16 | override fun isViewFromObject(view: View, `object`: Any): Boolean { 17 | return view == `object` 18 | } 19 | 20 | override fun instantiateItem(container: ViewGroup, position: Int): Any { 21 | val inflater = LayoutInflater.from(ref.get()?.context) 22 | val v = inflater.inflate(R.layout.fg_photoviewer_item, null) as ViewGroup 23 | val url = data[position] 24 | Glide.with(App.instance.applicationContext).load(url).into(v.photo) 25 | container.addView(v) 26 | return v 27 | } 28 | 29 | override fun getCount(): Int { 30 | return data.size 31 | } 32 | 33 | override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { 34 | container.removeView(`object` as View) 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/adapter/UsersAdapter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.adapter 2 | 3 | import android.content.Intent 4 | import androidx.recyclerview.widget.RecyclerView 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.bumptech.glide.Glide 9 | import com.bumptech.glide.request.RequestOptions 10 | import cool.mixi.dica.App 11 | import cool.mixi.dica.R 12 | import cool.mixi.dica.activity.UserActivity 13 | import cool.mixi.dica.bean.Consts 14 | import cool.mixi.dica.bean.User 15 | import cool.mixi.dica.fragment.UsersDialog 16 | import kotlinx.android.synthetic.main.users_list_item.view.* 17 | import java.util.* 18 | 19 | class UsersAdapter(val data: ArrayList, private val fragment: UsersDialog) 20 | : androidx.recyclerview.widget.RecyclerView.Adapter() { 21 | 22 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder { 23 | var view = LayoutInflater.from(fragment.context).inflate(R.layout.users_list_item, parent, false) 24 | view.setOnClickListener { gotoUserPage(it) } 25 | return UserViewHolder(view) 26 | } 27 | 28 | override fun getItemCount(): Int { 29 | return data.size 30 | } 31 | 32 | override fun onBindViewHolder(holder: UserViewHolder, position: Int) { 33 | var user = data?.get(position) 34 | holder.itemView.tag = position 35 | holder.userName.text = user.screen_name 36 | Glide.with(App.instance.applicationContext) 37 | .load(user.profile_image_url_large) 38 | .apply(RequestOptions().circleCrop()) 39 | .into(holder.avatar!!) 40 | } 41 | 42 | private fun gotoUserPage(view: View) { 43 | var position = view.tag as Int 44 | val i = Intent(fragment.activity, UserActivity::class.java) 45 | i.putExtra(Consts.EXTRA_USER, data[position]) 46 | fragment.activity?.startActivity(i) 47 | } 48 | 49 | } 50 | 51 | open class UserViewHolder(view: View): androidx.recyclerview.widget.RecyclerView.ViewHolder(view) { 52 | var userName = view.tv_username 53 | var avatar = view.avatar 54 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Attachment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class Attachment ( 4 | var url: String = "", 5 | var mimetype: String = "", 6 | var size: Int = 0 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Consts.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | object Consts { 4 | 5 | const val DB_NAME = "DiCa" 6 | const val TTL_META = 60 * 24 * 3 7 | const val TTL_USER = 60 * 24 * 5 8 | const val TTL_TAG = 60 * 24 * 1 9 | 10 | const val UPLOAD_MAX_PHOTOS = 3 11 | const val COMPRESS_PHOTO_QUALITY = 70 12 | const val API_CONNECT_TIMEOUT = 60.toLong() 13 | const val API_READ_TIMEOUT = 120.toLong() 14 | const val API_WRITE_TIMEOUT = 120.toLong() 15 | const val CACHE_SIZE_IN_MB = 30 16 | const val TIMELINE_PAGE_SIZE = 20 17 | 18 | const val REQ_PHOTO_PATH = 999 19 | const val REQ_STICKER = 987 20 | 21 | const val MAX_First_LEVEL_COMMENTS = 2 22 | const val MAX_SECOND_LEVEL_COMMENTS = 2 23 | 24 | const val ENABLE_FULL_TEXT_SEARCH = false 25 | 26 | const val OTYPE_ITEM = "item" 27 | const val OTYPE_INTRO = "intro" 28 | 29 | const val FRIENDICA_WEB = "https://friendi.ca" 30 | const val FRIENDICA_SERVERS_SOURCE = "https://dir.friendica.social/servers" 31 | const val MIXI_URL = "http://dica.mixi.cool" 32 | const val API_HOST = "https://meld.de" 33 | const val FRIENDICA_REGISTER_PATH = "/register" 34 | 35 | const val ID_STATUS = "statusId" 36 | const val FG_COMPOSE = "compose" 37 | const val FG_PHOTO_CROP = "crop" 38 | const val FG_USERS = "users" 39 | const val FG_PHOTO_VIEWER = "photoViewer" 40 | const val FG_SERVER_LIST = "serverList" 41 | 42 | const val EXTRA_PHOTO_URI = "photoUri" 43 | const val EXTRA_USER = "user" 44 | const val EXTRA_USER_ID = "userId" 45 | const val EXTRA_USER_NAME = "userName" 46 | const val EXTRA_USER_EMAIL = "email" 47 | const val EXTRA_USER_URL = "url" 48 | const val EXTRA_PHOTOS = "photos" 49 | const val EXTRA_SEARCH_TERM = "searchTerm" 50 | const val EXTRA_PHOTO_INDEX = "photoIndex" 51 | const val EXTRA_NOTIFICATIONS = "notifications" 52 | const val EXTRA_IN_REPLY_STATUS_ID = "in_reply_to_status_id" 53 | const val EXTRA_IN_REPLY_USERNAME = "in_reply_to_screen_name" 54 | const val EXTRA_RETWEET_TEXT = "retweet_txt" 55 | const val EXTRA_STICKER_URI = "sticker" 56 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/FriendicaActivities.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class FriendicaActivities( 4 | var like: ArrayList = ArrayList() 5 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Geo.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import android.location.Address 4 | 5 | data class Geo( 6 | var type: String = "", 7 | var coordinates: DoubleArray = DoubleArray(0), 8 | var address: Address? = null 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Group.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class Group( 4 | var name: String, 5 | var gid: Int, 6 | var user: ArrayList 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/HashTag.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.ColumnInfo.NOCASE 5 | import androidx.room.Entity 6 | import androidx.room.PrimaryKey 7 | import androidx.room.TypeConverters 8 | import cool.mixi.dica.util.TimestampConverter 9 | import java.util.* 10 | 11 | @Entity(tableName = "tag") 12 | data class HashTag( 13 | @PrimaryKey 14 | @ColumnInfo(collate = NOCASE) var name: String, 15 | 16 | @ColumnInfo var searchCount: Int = 0, 17 | 18 | @ColumnInfo var articleCount: Int = 0, 19 | 20 | @TypeConverters(TimestampConverter::class) 21 | @ColumnInfo var updatedAt: Date? = Calendar.getInstance().time 22 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Media.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class Media( 4 | var id: String = "", 5 | var media_id: Int = 0, 6 | var size:Int, 7 | var image: MediaImage? 8 | ) 9 | 10 | data class MediaImage( 11 | var w: Int, 12 | var h: Int, 13 | var image_type: String, 14 | var friendica_preview_url: String? 15 | ) { 16 | fun hashId(): String? { 17 | friendica_preview_url?.let { 18 | "\\/photo\\/([a-z0-9]+)-".toRegex().find(it)?.groupValues?.let {group -> 19 | return group[1] 20 | } 21 | } 22 | return friendica_preview_url 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Meta.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | import androidx.room.TypeConverters 7 | import cool.mixi.dica.util.TimestampConverter 8 | import java.util.* 9 | 10 | @Entity(tableName = "meta") 11 | data class Meta( 12 | @PrimaryKey 13 | @ColumnInfo(name = "url") var url: String, 14 | 15 | @ColumnInfo var title: String?, 16 | 17 | @ColumnInfo var icon: String?, 18 | 19 | @ColumnInfo var description: String?, 20 | 21 | @TypeConverters(TimestampConverter::class) 22 | @ColumnInfo var created: Date? 23 | ){ 24 | fun copy(meta: Meta){ 25 | this.url = meta.url 26 | this.icon = meta.icon 27 | this.title = meta.title 28 | this.description = meta.description 29 | } 30 | 31 | override fun equals(other: Any?): Boolean { 32 | if(other?.javaClass != this.javaClass) return false 33 | other as Meta 34 | return other.url == this.url 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Notification.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import java.io.Serializable 4 | 5 | data class Notification( 6 | var id: Int, 7 | var parent: Int, 8 | var url: String, 9 | var photo: String, 10 | var name: String, 11 | var timestamp: Long, 12 | var msg_plain: String, 13 | var seen: Int, 14 | var type: Int, 15 | var date_rel: String, 16 | var otype: String 17 | ): Serializable -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Photo.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class Photo( 4 | var id: String, 5 | var album: String, 6 | var width: Int, 7 | var height: Int, 8 | var type: String 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Profile.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class Profile( 4 | var multi_profiles: Boolean, 5 | var friendica_owner: User 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/Status.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import cool.mixi.dica.util.dicaHTMLFilter 4 | import cool.mixi.dica.util.getBaseUri 5 | import java.util.* 6 | 7 | data class Status( 8 | var id: Int = 0, 9 | var user: User = User(), 10 | var friendica_owner: User = User(), 11 | var friendica_comments: Int = 0, 12 | var statusnet_html: String = "", 13 | var text: String = "", 14 | var geo: Geo? = Geo(), 15 | var in_reply_to_user_id: Int = 0, 16 | var in_reply_to_status_id: Int = 0, 17 | var in_reply_to_screen_name: String = "", 18 | var friendica_private: Boolean = false, 19 | var external_url: String = "", 20 | var created_at: String = "", 21 | var source: String? = "", 22 | var favorited: Boolean = false, 23 | var friendica_activities: FriendicaActivities = FriendicaActivities(), 24 | var attachments: ArrayList? = ArrayList(), 25 | var apEntry: APEntry? = APEntry(), 26 | var avatar: String = "", 27 | var retweeted_status: Status? = null, 28 | 29 | // extra params for status page (comments) 30 | var indent: Int = 0, 31 | var firstCommentId: Int = 0, 32 | var isHide: Boolean = false, 33 | var showExpandText: Boolean = false, 34 | var hideCommentsCount: Int = 0, 35 | 36 | // extra params 37 | var enableNSFW: Boolean = false, 38 | var displayedTitle: HashMap = HashMap() 39 | ) { 40 | override fun equals(other: Any?): Boolean { 41 | if (other?.javaClass != this.javaClass) return false 42 | 43 | other as Status 44 | return other.id == this.id 45 | } 46 | 47 | fun toFriendicaShareText(): String { 48 | var author = this.apEntry?.author?.name 49 | var profile = this.apEntry?.author?.uri 50 | var link = this.apEntry?.id 51 | this.user.url.isEmpty().let { 52 | if (it) return@let 53 | author = this.user.screen_name 54 | profile = this.user.url 55 | avatar = this.user.profile_image_url_large 56 | link = this.external_url 57 | } 58 | 59 | var sb = StringBuffer() 60 | sb.append("[share ") 61 | sb.append("author='$author' ") 62 | sb.append("avatar='${this.avatar}' ") 63 | sb.append("posted='${this.created_at}' ") 64 | sb.append("profile='$profile' ") 65 | sb.append("link='$link' ") 66 | sb.append("] ") 67 | sb.append( 68 | "\n${this.statusnet_html 69 | .replace("\\[".toRegex(), "(") 70 | .replace("\\]".toRegex(), ")") 71 | .dicaHTMLFilter(true, external_url.getBaseUri())}\n" 72 | ) 73 | sb.append("[/share]") 74 | return sb.toString() 75 | } 76 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/User.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | import androidx.room.* 4 | import cool.mixi.dica.util.TimestampConverter 5 | import java.io.Serializable 6 | import java.net.URL 7 | import java.util.* 8 | 9 | @Entity( 10 | primaryKeys = ["id", "url"], 11 | tableName = "user", 12 | indices = [ 13 | Index(value = ["screen_name", "name"]) 14 | ] 15 | ) 16 | data class User ( 17 | var id:Int = 0, 18 | @ColumnInfo(name = "avatar") var profile_image_url_large: String = "", 19 | @ColumnInfo var url: String = "", 20 | @ColumnInfo var screen_name: String = "", 21 | @ColumnInfo var name: String = "", 22 | 23 | @TypeConverters(TimestampConverter::class) 24 | @ColumnInfo var updatedAt: Date? = Calendar.getInstance().time, 25 | 26 | @Ignore var statusnet_profile_url: String = "", 27 | @Ignore var friends_count: Int = 0, 28 | @Ignore var statuses_count: Int = 0, 29 | @Ignore var followers_count: Int = 0, 30 | @Ignore var following: Boolean = false, 31 | @Ignore var location: String = "", 32 | @Ignore var description: String = "" 33 | ): Serializable { 34 | 35 | override fun equals(other: Any?): Boolean { 36 | if(other?.javaClass != this.javaClass) return false 37 | other as User 38 | return other.id == this.id 39 | } 40 | 41 | fun getEmail(): String { 42 | return "$screen_name@${getDomain()}" 43 | } 44 | 45 | fun getDomain(): String { 46 | return try { 47 | URL(url).host 48 | }catch (e: Exception){ 49 | url 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/WebFinger.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class WebFinger( 4 | var subject: String?, 5 | var aliases: ArrayList?, 6 | var links: ArrayList? 7 | ) { 8 | fun getATOMXMLUrl(): String? { 9 | links?.forEach { 10 | if(it.type == "application/atom+xml") return it.href 11 | } 12 | return null 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/bean/WebFingerLink.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.bean 2 | 3 | data class WebFingerLink( 4 | var rel: String?, 5 | var type: String?, 6 | var href: String? 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/database/AppDatabase.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.database 2 | 3 | import androidx.room.Database 4 | import androidx.room.Room 5 | import androidx.room.RoomDatabase 6 | import androidx.room.TypeConverters 7 | import androidx.room.migration.Migration 8 | import androidx.sqlite.db.SupportSQLiteDatabase 9 | import cool.mixi.dica.App 10 | import cool.mixi.dica.bean.Consts 11 | import cool.mixi.dica.bean.HashTag 12 | import cool.mixi.dica.bean.Meta 13 | import cool.mixi.dica.bean.User 14 | import cool.mixi.dica.database.dao.HashTagDao 15 | import cool.mixi.dica.database.dao.MetaDao 16 | import cool.mixi.dica.database.dao.UserDao 17 | import cool.mixi.dica.util.TimestampConverter 18 | import cool.mixi.dica.util.tagEscapeHash 19 | import org.jetbrains.anko.doAsync 20 | import java.util.* 21 | 22 | @Database(entities = [Meta::class, User::class, HashTag::class], version = 3, exportSchema = false) 23 | @TypeConverters(TimestampConverter::class) 24 | abstract class AppDatabase: RoomDatabase() { 25 | 26 | abstract fun metaDao(): MetaDao 27 | abstract fun userDao(): UserDao 28 | abstract fun hashTagDao(): HashTagDao 29 | 30 | companion object { 31 | @Volatile 32 | private var db: AppDatabase? = null 33 | 34 | fun getInstance(): AppDatabase { 35 | return db ?: synchronized(this) { 36 | db = Room.databaseBuilder( 37 | App.instance.applicationContext, 38 | AppDatabase::class.java, 39 | "${Consts.DB_NAME}01" 40 | ) 41 | .addMigrations(MigrationDb(2, 3)) 42 | .fallbackToDestructiveMigration() 43 | .build() 44 | db!! 45 | } 46 | } 47 | 48 | fun getDefaultExpire(expire: Int): Date { 49 | val calendar = Calendar.getInstance() 50 | calendar.add(Calendar.MINUTE, 0 - expire) 51 | return calendar.time 52 | } 53 | 54 | fun upsertHashTag(tag: String){ 55 | doAsync { 56 | var tmpStr = tag.tagEscapeHash() 57 | val dao = AppDatabase.getInstance().hashTagDao() 58 | val hashTag = HashTag(tmpStr) 59 | dao.add(hashTag) 60 | dao.incr(tmpStr) 61 | } 62 | } 63 | } 64 | 65 | class MigrationDb(startVersion:Int, endVersion:Int): Migration(startVersion, endVersion) { 66 | override fun migrate(database: SupportSQLiteDatabase) {} 67 | } 68 | 69 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/database/dao/HashTagDao.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import cool.mixi.dica.bean.Consts 8 | import cool.mixi.dica.bean.HashTag 9 | import cool.mixi.dica.database.AppDatabase 10 | import java.util.* 11 | 12 | @Dao 13 | interface HashTagDao { 14 | 15 | @Query("SELECT COUNT(*) FROM tag") 16 | fun count(): Int 17 | 18 | @Query("DELETE FROM tag WHERE updatedAt < :expireDate AND searchCount = 0") 19 | fun expireClean(expireDate: Date? = AppDatabase.getDefaultExpire(Consts.TTL_TAG)) 20 | 21 | @Query("UPDATE tag SET searchCount = searchCount+1, updatedAt = :date WHERE name = :name") 22 | fun incr(name: String, date: Long? = Date().time) 23 | 24 | @Query("SELECT * FROM tag WHERE name = :name") 25 | fun get(name:String): HashTag? 26 | 27 | @Insert(onConflict = OnConflictStrategy.IGNORE) 28 | fun add(hashTag: HashTag) 29 | 30 | @Query("SELECT * FROM tag ORDER BY searchCount DESC") 31 | fun getAll(): List? 32 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/database/dao/MetaDao.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.Query 6 | import cool.mixi.dica.bean.Consts 7 | import cool.mixi.dica.bean.Meta 8 | import cool.mixi.dica.database.AppDatabase 9 | import java.util.* 10 | 11 | @Dao 12 | interface MetaDao { 13 | @Query("SELECT * FROM meta WHERE created < :expireDate") 14 | fun expire(expireDate: Date):List? 15 | 16 | @Query("DELETE FROM meta WHERE created < :expireDate") 17 | fun expireClean(expireDate: Date? = AppDatabase.getDefaultExpire(Consts.TTL_META)) 18 | 19 | @Query("SELECT COUNT(*) FROM meta") 20 | fun count(): Int 21 | 22 | @Query("SELECT * FROM meta WHERE url = (:url)") 23 | fun get(url: String): Meta? 24 | 25 | @Query("SELECT * FROM meta") 26 | fun getAll(): List? 27 | 28 | @Query("DELETE FROM meta WHERE 1") 29 | fun deleteAll() 30 | 31 | @Insert 32 | fun add(meta: Meta) 33 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/database/dao/UserDao.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import cool.mixi.dica.bean.Consts 8 | import cool.mixi.dica.bean.User 9 | import cool.mixi.dica.database.AppDatabase 10 | import java.util.* 11 | 12 | @Dao 13 | interface UserDao { 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | fun upsert(user: User) 16 | 17 | @Query("DELETE FROM user WHERE updatedAt < :expireDate") 18 | fun expireClean(expireDate: Date? = AppDatabase.getDefaultExpire(Consts.TTL_USER)) 19 | 20 | @Query("SELECT * FROM user WHERE screen_name LIKE :name OR name LIKE :name") 21 | fun search(name: String): List 22 | 23 | @Query("SELECT COUNT(*) FROM user") 24 | fun count(): Int 25 | 26 | @Query("SELECT * FROM user") 27 | fun getAll(): List? 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/BaseDialogFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import android.os.Build 4 | import androidx.fragment.app.DialogFragment 5 | import androidx.fragment.app.FragmentManager 6 | import cool.mixi.dica.util.eLog 7 | 8 | open class BaseDialogFragment: androidx.fragment.app.DialogFragment() { 9 | fun myShow(manager: androidx.fragment.app.FragmentManager?, tag: String) { 10 | if (manager == null) { 11 | return 12 | } 13 | 14 | if (Integer.valueOf(android.os.Build.VERSION.SDK) > Build.VERSION_CODES.JELLY_BEAN) { 15 | if (manager.isDestroyed) { 16 | return 17 | } 18 | } 19 | 20 | try { 21 | val ft = manager.beginTransaction() 22 | ft.add(this, tag) 23 | ft.commitAllowingStateLoss() 24 | } catch (e: Exception) { 25 | eLog(e.message!!) 26 | } 27 | 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/FriendicaServerListDialog.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.ProgressBar 8 | import cool.mixi.dica.App 9 | import cool.mixi.dica.R 10 | import cool.mixi.dica.adapter.FriendicaServerListAdapter 11 | import cool.mixi.dica.bean.Meta 12 | import cool.mixi.dica.util.HtmlCrawler 13 | import cool.mixi.dica.util.IHtmlCrawler 14 | import kotlinx.android.synthetic.main.dlg_notifications.view.* 15 | import java.lang.ref.WeakReference 16 | 17 | class FriendicaServerListDialog: BaseDialogFragment(){ 18 | 19 | var rootView: View? = null 20 | var adapter:FriendicaServerListAdapter? = null 21 | var registrationMode = false 22 | var pb: ProgressBar? = null 23 | 24 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 25 | rootView = inflater?.inflate(R.layout.dlg_friendica_server_list, container) 26 | rootView?.table?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) 27 | adapter = FriendicaServerListAdapter(this) 28 | rootView?.table?.adapter = adapter 29 | var decoration = androidx.recyclerview.widget.DividerItemDecoration( 30 | App.instance.applicationContext, 31 | androidx.recyclerview.widget.DividerItemDecoration.VERTICAL 32 | ) 33 | rootView?.table?.addItemDecoration(decoration) 34 | pb = rootView?.findViewById(R.id.pb) 35 | return rootView 36 | } 37 | 38 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 39 | super.onViewCreated(view, savedInstanceState) 40 | val ref = WeakReference(this) 41 | val servers = HtmlCrawler.getInstance().friendicaServerList(object: IHtmlCrawler{ 42 | override fun done(meta: Meta) { 43 | ref.get()?.let { 44 | it.pb?.visibility = View.GONE 45 | it.adapter?.notifyDataSetChanged() 46 | } 47 | } 48 | }) 49 | 50 | servers?.let { 51 | if(it.size > 0){ 52 | adapter?.notifyDataSetChanged() 53 | ref.get()?.pb?.visibility = View.GONE 54 | } 55 | } 56 | } 57 | 58 | override fun onStart() { 59 | super.onStart() 60 | dialog?.window?.setLayout( 61 | ViewGroup.LayoutParams.MATCH_PARENT, 62 | ViewGroup.LayoutParams.WRAP_CONTENT 63 | ) 64 | } 65 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/PhotoViewerFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import android.graphics.Color 4 | import android.graphics.drawable.ColorDrawable 5 | import android.os.Bundle 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import cool.mixi.dica.R 10 | import cool.mixi.dica.adapter.PhotoViewerAdapter 11 | import cool.mixi.dica.bean.Consts 12 | import kotlinx.android.synthetic.main.fg_photoviewer.* 13 | import java.lang.ref.WeakReference 14 | 15 | class PhotoViewerFragment: BaseDialogFragment() { 16 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { 17 | val view = inflater?.inflate(R.layout.fg_photoviewer, container, false) 18 | return view!! 19 | } 20 | 21 | override fun onStart() { 22 | super.onStart() 23 | val dialog = dialog 24 | if (dialog != null) { 25 | dialog.window!!.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 26 | dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.BLACK)) 27 | } 28 | } 29 | 30 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 31 | super.onViewCreated(view, savedInstanceState) 32 | arguments?.getSerializable(Consts.EXTRA_PHOTOS).let { 33 | photos.adapter = PhotoViewerAdapter(it as ArrayList, WeakReference(this)) 34 | photos.currentItem = arguments?.getInt(Consts.EXTRA_PHOTO_INDEX, 0)!! 35 | tab_layout.setupWithViewPager(photos, true) 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/TimelineFavoritesFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import cool.mixi.dica.bean.Status 4 | import cool.mixi.dica.util.ApiService 5 | import retrofit2.Call 6 | 7 | class TimelineFavoritesFragment: TimelineFragment() { 8 | override fun sourceOld(): Call> { 9 | return ApiService.create().favoritesTimeline("", "${stl?.maxId}") 10 | } 11 | 12 | override fun sourceNew(): Call> { 13 | reloadNotification() 14 | return ApiService.create().favoritesTimeline("${stl?.sinceId}", "") 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/TimelineFriendsFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import cool.mixi.dica.bean.Status 4 | import cool.mixi.dica.util.ApiService 5 | import retrofit2.Call 6 | 7 | class TimelineFriendsFragment: TimelineFragment() { 8 | override fun sourceOld(): Call> { 9 | return ApiService.create().statusFriendsTimeline("", "${stl?.maxId}") 10 | } 11 | 12 | override fun sourceNew(): Call> { 13 | return ApiService.create().statusFriendsTimeline("${stl?.sinceId}", "") 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/TimelineMyFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import cool.mixi.dica.App 4 | import cool.mixi.dica.bean.Status 5 | import cool.mixi.dica.util.ApiService 6 | import retrofit2.Call 7 | 8 | class TimelineMyFragment: TimelineFragment() { 9 | 10 | companion object { 11 | var myId: Int? = App.instance.myself?.friendica_owner?.id 12 | } 13 | 14 | override fun sourceOld(): Call>? { 15 | if(myId == null){ return null } 16 | return ApiService.create().statusUserTimeline(myId!!, "", "${stl?.maxId}") 17 | } 18 | 19 | override fun sourceNew(): Call>? { 20 | if(myId == null){ return null } 21 | return ApiService.create().statusUserTimeline(myId!!, "${stl?.sinceId}", "") 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/TimelineNetworkFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import cool.mixi.dica.bean.Status 4 | import cool.mixi.dica.util.ApiService 5 | import retrofit2.Call 6 | 7 | class TimelineNetworkFragment: TimelineFragment() { 8 | override fun sourceOld(): Call> { 9 | return ApiService.create().statusNetworkTimeline("", "${stl?.maxId}") 10 | } 11 | 12 | override fun sourceNew(): Call> { 13 | return ApiService.create().statusNetworkTimeline("${stl?.sinceId}", "") 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/TimelinePublicFragment.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import cool.mixi.dica.bean.Status 4 | import cool.mixi.dica.util.ApiService 5 | import retrofit2.Call 6 | 7 | class TimelinePublicFragment: TimelineFragment() { 8 | override fun sourceOld(): Call> { 9 | return ApiService.create().statusPublicTimeline("", "${stl?.maxId}") 10 | } 11 | 12 | override fun sourceNew(): Call> { 13 | return ApiService.create().statusPublicTimeline("${stl?.sinceId}", "") 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/fragment/UsersDialog.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.fragment 2 | 3 | import android.os.Bundle 4 | import androidx.recyclerview.widget.DividerItemDecoration 5 | import androidx.recyclerview.widget.LinearLayoutManager 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import cool.mixi.dica.App 10 | import cool.mixi.dica.R 11 | import cool.mixi.dica.adapter.UsersAdapter 12 | import cool.mixi.dica.bean.User 13 | import kotlinx.android.synthetic.main.dlg_notifications.view.* 14 | 15 | class UsersDialog: BaseDialogFragment(){ 16 | var rootView: View? = null 17 | var users: ArrayList? = ArrayList() 18 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 19 | rootView = inflater?.inflate(R.layout.dlg_users, container) 20 | rootView?.table?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) 21 | rootView?.table?.adapter = UsersAdapter(users as java.util.ArrayList, this) 22 | var decoration = androidx.recyclerview.widget.DividerItemDecoration( 23 | App.instance.applicationContext, 24 | androidx.recyclerview.widget.DividerItemDecoration.VERTICAL 25 | ) 26 | rootView?.table?.addItemDecoration(decoration) 27 | return rootView 28 | } 29 | 30 | override fun onStart() { 31 | super.onStart() 32 | dialog?.window?.setLayout( 33 | ViewGroup.LayoutParams.MATCH_PARENT, 34 | ViewGroup.LayoutParams.WRAP_CONTENT 35 | ) 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/service/NotificationJonService.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.service 2 | 3 | import android.app.NotificationChannel 4 | import android.app.NotificationManager 5 | import android.app.PendingIntent 6 | import android.app.job.JobParameters 7 | import android.app.job.JobService 8 | import android.content.Context 9 | import android.content.Intent 10 | import android.graphics.BitmapFactory 11 | import android.os.Build 12 | import androidx.core.app.NotificationCompat 13 | import cool.mixi.dica.App 14 | import cool.mixi.dica.R 15 | import cool.mixi.dica.activity.IndexActivity 16 | import cool.mixi.dica.bean.Consts 17 | import cool.mixi.dica.util.ApiService 18 | import cool.mixi.dica.util.dLog 19 | import org.jetbrains.anko.doAsync 20 | import org.jetbrains.anko.uiThread 21 | 22 | class NotificationJonService: JobService() { 23 | companion object { 24 | val jobId = 1 25 | } 26 | 27 | private val notificationId = 1 28 | override fun onStopJob(params: JobParameters?): Boolean { 29 | dLog("onStopJob") 30 | return false 31 | } 32 | 33 | override fun onStartJob(params: JobParameters?): Boolean { 34 | dLog("onStartJob") 35 | doAsync { 36 | val response = ApiService.create().friendicaNotifications().execute() 37 | response.body()?.let { 38 | App.instance.addNotification(it) 39 | } 40 | uiThread { 41 | dLog("unread notification ${App.instance.getUnSeenNotificationCount()} ${App.instance.notifications.size}") 42 | val appName = getString(R.string.app_name) 43 | val strNotify = getString(R.string.notifications) 44 | val notificationChannelId = "$appName $strNotify" 45 | val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 46 | createChannel(notificationChannelId, notificationManager) 47 | 48 | val size = App.instance.getUnSeenNotificationCount() 49 | if(size == 0) { 50 | notificationManager.cancel(notificationId) 51 | jobFinished(params, false) 52 | return@uiThread 53 | } 54 | 55 | val resultIntent = Intent(applicationContext, IndexActivity::class.java).apply { 56 | this.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK 57 | this.putExtra(Consts.EXTRA_NOTIFICATIONS, true) 58 | } 59 | 60 | val pendingIntent = PendingIntent.getActivity(applicationContext, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT) 61 | val message = getString(R.string.new_notification_count).format("$size") 62 | val notification = NotificationCompat.Builder(App.instance.applicationContext) 63 | .setSmallIcon(R.drawable.ic_launcher) 64 | .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.ic_launcher)) 65 | .setContentTitle(getString(R.string.app_name)) 66 | .setContentText(message) 67 | .setChannelId(notificationChannelId) 68 | .setContentIntent(pendingIntent) 69 | .build() 70 | notificationManager.notify(notificationId, notification) 71 | jobFinished(params, false) 72 | } 73 | } 74 | return true 75 | } 76 | 77 | private fun createChannel(channelId: String, mgr: NotificationManager){ 78 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O){ return; } 79 | val channel = NotificationChannel(channelId, getString(R.string.app_name), NotificationManager.IMPORTANCE_DEFAULT) 80 | mgr.createNotificationChannel(channel) 81 | } 82 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/util/DiCaUtil.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.util 2 | 3 | import android.app.Activity 4 | import android.content.Context 5 | import android.view.View 6 | import android.view.inputmethod.InputMethodManager 7 | 8 | class DiCaUtil { 9 | 10 | companion object { 11 | fun hideKeyboard(activity: Activity) { 12 | val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager 13 | var view = activity.currentFocus 14 | if (view == null) { 15 | view = View(activity) 16 | } 17 | imm!!.hideSoftInputFromWindow(view!!.windowToken, 0) 18 | } 19 | 20 | fun hideKeyboard(context:Context?, view: View){ 21 | if(context == null){ 22 | return 23 | } 24 | 25 | val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 26 | imm?.hideSoftInputFromWindow(view?.windowToken, 0) 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/util/NetworkUtil.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.util 2 | 3 | import android.content.Context 4 | import android.net.ConnectivityManager 5 | import android.net.NetworkInfo 6 | import cool.mixi.dica.App 7 | 8 | 9 | class NetworkUtil { 10 | companion object { 11 | fun isNetworkConnected(): Boolean { 12 | val mConnectivityManager = App.instance.applicationContext 13 | .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager 14 | val mNetworkInfo = mConnectivityManager.activeNetworkInfo 15 | if (mNetworkInfo != null && mNetworkInfo.isConnected) { 16 | return true 17 | } 18 | return false 19 | } 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/util/TimestampConverter.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.util 2 | 3 | import androidx.room.TypeConverter 4 | import java.util.* 5 | 6 | object TimestampConverter { 7 | 8 | @TypeConverter 9 | @JvmStatic 10 | fun toLong(value: Date?): Long? = value?.time 11 | 12 | @TypeConverter 13 | @JvmStatic 14 | fun toDate(value: Long?): Date? = value?.let(::Date) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/HackViewPager.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.content.Context 4 | import androidx.viewpager.widget.ViewPager 5 | import android.util.AttributeSet 6 | import android.view.MotionEvent 7 | 8 | class HackViewPager(context: Context, attrs: AttributeSet): androidx.viewpager.widget.ViewPager(context, attrs) { 9 | override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { 10 | return try { 11 | super.onInterceptTouchEvent(ev) 12 | }catch (e: IllegalArgumentException){ 13 | e.printStackTrace() 14 | false 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/MyQuoteSpan.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.Paint 5 | import android.text.Layout 6 | import android.text.style.LeadingMarginSpan 7 | 8 | 9 | 10 | class MyQuoteSpan(private val borderColor:Int, val borderWidth: Int, val gapWidth: Int): LeadingMarginSpan { 11 | override fun drawLeadingMargin( 12 | c: Canvas?, 13 | p: Paint?, 14 | x: Int, 15 | dir: Int, 16 | top: Int, 17 | baseline: Int, 18 | bottom: Int, 19 | text: CharSequence?, 20 | start: Int, 21 | end: Int, 22 | first: Boolean, 23 | layout: Layout? 24 | ) { 25 | val style = p?.style 26 | val color = p?.color 27 | 28 | p?.style = Paint.Style.FILL 29 | p?.color = borderColor 30 | 31 | c?.drawRect(x.toFloat(), top.toFloat(), (x + dir * borderWidth).toFloat(), bottom.toFloat(), p) 32 | 33 | p?.style = style 34 | color?.let { p.color = it } 35 | } 36 | 37 | override fun getLeadingMargin(first: Boolean): Int { 38 | return borderWidth + gapWidth 39 | } 40 | 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/MySocialEditTextView.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.KeyEvent 6 | import android.view.inputmethod.InputMethodManager 7 | import com.hendraanggrian.appcompat.widget.SocialAutoCompleteTextView 8 | 9 | class MySocialEditTextView(context: Context, attrs: AttributeSet): SocialAutoCompleteTextView(context, attrs){ 10 | override fun onKeyPreIme(keyCode: Int, event: KeyEvent?): Boolean { 11 | if (keyCode === KeyEvent.KEYCODE_BACK && isPopupShowing) { 12 | val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 13 | if (inputManager.hideSoftInputFromWindow( 14 | findFocus().windowToken, 15 | InputMethodManager.HIDE_NOT_ALWAYS 16 | ) 17 | ) { 18 | return true 19 | } 20 | } 21 | 22 | return super.onKeyPreIme(keyCode, event) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/MyWebView.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.content.Context 4 | import android.net.Uri 5 | import android.util.AttributeSet 6 | import android.webkit.WebResourceRequest 7 | import android.webkit.WebView 8 | import android.webkit.WebViewClient 9 | import cool.mixi.dica.App 10 | import cool.mixi.dica.R 11 | import cool.mixi.dica.activity.StickerActivity 12 | import cool.mixi.dica.util.PrefUtil 13 | import cool.mixi.dica.util.eLog 14 | import java.lang.ref.SoftReference 15 | import java.net.URLDecoder 16 | 17 | interface IStickerPicker { 18 | fun stickerSelected(url: String) 19 | } 20 | 21 | class MyWebView(context: Context, attrs: AttributeSet): WebView(context, attrs){ 22 | private val googleSearch = "https://www.google.com/search?" 23 | private val ref: SoftReference = SoftReference(context as StickerActivity) 24 | init { 25 | this.settings.javaScriptEnabled = true 26 | this.settings.domStorageEnabled = true 27 | this.settings.setAppCacheEnabled(true) 28 | this.webViewClient = MyWebViewClient(ref) 29 | 30 | try { 31 | val uri = Uri.parse(googleSearch+PrefUtil.getStickerUrl()).toString() 32 | this.loadUrl(uri) 33 | }catch (e: Exception){ eLog("${e.message}")} 34 | } 35 | } 36 | 37 | class MyWebViewClient(private val ref: SoftReference): WebViewClient(){ 38 | 39 | private var urlCapture: Boolean = false 40 | private var notSuportSearchType = ref.get()?.getString(R.string.sticker_image_search_only) 41 | override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { 42 | val url = request?.url.toString() 43 | if(!url?.contains("tbm=isch")){ 44 | App.instance.toast("$notSuportSearchType") 45 | return true 46 | } 47 | return false 48 | } 49 | 50 | override fun onPageFinished(view: WebView?, url: String?) { 51 | super.onPageFinished(view, url) 52 | ref.get()?.loaded() 53 | 54 | if(url == null) return 55 | if (url.indexOf("imgrc=") > -1 && !url.contains("imgrc=_")) { 56 | urlCapture = true 57 | } 58 | } 59 | 60 | override fun onLoadResource(view: WebView?, url: String?) { 61 | super.onLoadResource(view, url) 62 | ref.get().let { 63 | if(it == null) return 64 | } 65 | 66 | if (!urlCapture) { return } 67 | 68 | url?.let { 69 | if ((it.contains("google.com") && !it.contains("imgurl")) 70 | || it.contains("gstatic.com")) { 71 | return 72 | } 73 | 74 | var finalImageUrl = it 75 | if (it.contains("imgurl") && it.contains("google")) { 76 | val uri = Uri.parse(it) 77 | val encodeUrl = uri.getQueryParameter("imgurl") 78 | try { 79 | finalImageUrl = URLDecoder.decode(encodeUrl!!, "UTF-8") 80 | } catch (e: Exception) {} 81 | } 82 | 83 | ref.get()?.stickerSelected(finalImageUrl) 84 | urlCapture = false 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/RecyclingRoundSpan.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.Paint 5 | import android.graphics.RectF 6 | import android.text.style.ReplacementSpan 7 | 8 | 9 | 10 | class RecyclingRoundSpan(val bgColor: Int, val redius: Int): ReplacementSpan() { 11 | val padding = 40 12 | 13 | override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int { 14 | return (padding + paint.measureText(text?.subSequence(start, end).toString()) + padding).toInt() 15 | } 16 | 17 | override fun draw( 18 | canvas: Canvas, 19 | text: CharSequence?, 20 | start: Int, 21 | end: Int, 22 | x: Float, 23 | top: Int, 24 | y: Int, 25 | bottom: Int, 26 | paint: Paint 27 | ) { 28 | val width = paint.measureText(text?.subSequence(start, end).toString()) 29 | val orgColor = paint.color 30 | val rect = RectF(x - padding, top.toFloat(), x + width + padding, bottom.toFloat()) 31 | paint.color = bgColor 32 | canvas.drawRoundRect(rect, redius.toFloat(), redius.toFloat(), paint) 33 | paint.color = orgColor 34 | canvas.drawText(text, start, end, x, y.toFloat(), paint) 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/RoundedBackgroundSpan.java: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Paint; 5 | import android.graphics.RectF; 6 | import android.text.style.ReplacementSpan; 7 | 8 | public class RoundedBackgroundSpan extends ReplacementSpan { 9 | 10 | private static int CORNER_RADIUS = 8; 11 | private int backgroundColor = 0; 12 | private int textColor = 0; 13 | 14 | public RoundedBackgroundSpan(int backgroundColor,int textColor) { 15 | super(); 16 | this.backgroundColor = backgroundColor; 17 | this.textColor = textColor; 18 | } 19 | 20 | @Override 21 | public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { 22 | Paint.FontMetrics fm = paint.getFontMetrics(); 23 | // RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom); 24 | // fm.bottom - fm.top 解决设置行距(android:lineSpacingMultiplier="1.2")时背景色高度问题 25 | RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), fm.bottom - fm.top ); 26 | paint.setColor(backgroundColor); 27 | canvas.drawRoundRect(rect, CORNER_RADIUS, CORNER_RADIUS, paint); 28 | paint.setColor(textColor); 29 | canvas.drawText(text, start, end, x, y, paint); 30 | } 31 | 32 | @Override 33 | public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm){ 34 | return Math.round(paint.measureText(text, start, end)); 35 | } 36 | 37 | private float measureText(Paint paint, CharSequence text, int start, int end) { 38 | return paint.measureText(text, start, end); 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/cool/mixi/dica/view/WebImageSpan.kt: -------------------------------------------------------------------------------- 1 | package cool.mixi.dica.view 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.drawable.BitmapDrawable 5 | import android.widget.TextView 6 | import com.bumptech.glide.Glide 7 | import org.jetbrains.anko.doAsync 8 | import org.jetbrains.anko.uiThread 9 | 10 | class WebImageSpan { 11 | companion object { 12 | fun getDrawable(url: String, textView: TextView): BitmapDrawable { 13 | var bitmapDrawable = BitmapDrawable() 14 | doAsync { 15 | val featureRequest= Glide.with(textView).load(url).submit(500, 500) 16 | featureRequest.get().setBounds(0, 0, 500, 500) 17 | val drawable = (featureRequest.get() as BitmapDrawable) 18 | val canvas = Canvas(drawable.bitmap) 19 | uiThread { 20 | bitmapDrawable.setBounds(0, 0, 500, 500) 21 | bitmapDrawable?.draw(canvas) 22 | bitmapDrawable?.invalidateSelf() 23 | textView.invalidate() 24 | // Glide.with(textView).clear(featureRequest) 25 | } 26 | } 27 | return bitmapDrawable 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_comment.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_favourite.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_like.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_menu.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_unfavourite.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/action_unlike.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_album.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_album_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_camera_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_gps.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_gps_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_photo.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_private.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_private_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_public.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_public_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_smiley.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_smiley_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_submit.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dialog_submit_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/notification_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/photo_crop.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/photo_reset.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/photo_rotate.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/retweet.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/status_delete.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/user_desc.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/user_name.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/user_sitename.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_favourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_unfavourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_unfavourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_unlike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/action_unlike.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_album.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_album_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_album_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_camera_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_gps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_gps_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_gps_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_photo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_private.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_private.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_private_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_private_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_public_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_public_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_smiley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_smiley.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_smiley_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_smiley_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_submit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_submit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/dialog_submit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/notification_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/photo_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/photo_crop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/photo_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/photo_reset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/photo_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/photo_rotate.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/retweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/retweet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/status_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/status_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/user_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/user_desc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/user_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/user_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/user_sitename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-hdpi/user_sitename.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_favourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_unfavourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_unfavourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_unlike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/action_unlike.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_album.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_album_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_album_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_camera_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_gps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_gps_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_gps_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_photo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_private.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_private.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_private_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_private_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_public_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_public_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_smiley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_smiley.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_smiley_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_smiley_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_submit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/dialog_submit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/dialog_submit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/notification_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/photo_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/photo_crop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/photo_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/photo_reset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/photo_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/photo_rotate.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/retweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/retweet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/status_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/status_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/user_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/user_desc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/user_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/user_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/user_sitename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-mdpi/user_sitename.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/round_create_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-v24/round_create_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_favourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_unfavourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_unfavourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_unlike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/action_unlike.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_album.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_album_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_album_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_camera_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_gps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_gps_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_gps_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_photo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_private.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_private.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_private_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_private_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_public_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_public_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_smiley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_smiley.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_smiley_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_smiley_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_submit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dialog_submit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/dialog_submit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/notification_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/photo_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/photo_crop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/photo_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/photo_reset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/photo_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/photo_rotate.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/retweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/retweet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/status_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/status_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/user_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/user_desc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/user_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/user_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/user_sitename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xhdpi/user_sitename.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_favourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_unfavourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_unfavourite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_unlike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/action_unlike.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_album.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_album_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_album_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_camera_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_gps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_gps_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_gps_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_photo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_private.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_private.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_private_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_private_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_public_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_public_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_smiley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_smiley.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_smiley_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_smiley_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_submit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/dialog_submit_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/dialog_submit_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/notification_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/photo_crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/photo_crop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/photo_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/photo_reset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/photo_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/photo_rotate.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/retweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/retweet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/status_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/status_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/user_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/user_desc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/user_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/user_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/user_sitename.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable-xxhdpi/user_sitename.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dot_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dot_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dot_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/emoji.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/favorites.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorites_sel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/favorites_sel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/friend_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/friend_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/ic_camera.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/ic_gps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/lock.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/notify_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/notify_off.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/notify_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/notify_on.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/photo_preview_box.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/recycling_status_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reply_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reply_vertical_line.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/retweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/retweet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_create_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/round_create_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_photo_camera_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/round_photo_camera_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_photo_size_select_actual_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/round_photo_size_select_actual_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_reply_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/round_reply_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/server_list_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/server_list_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/share_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/share_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/status_backgroud_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/status_website_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/thumb_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/thumb_up.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/thumb_up_sel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/app/src/main/res/drawable/thumb_up_sel.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_status.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 13 | 14 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_sticker.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 18 | 19 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/box_status_action.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 18 | 24 | 30 | 36 | 44 | 45 | 46 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/box_status_action_comment.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 18 | 24 | 30 | 36 | 43 | 44 | 45 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/box_status_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 18 | 25 | 26 | 34 | 41 | 42 | 49 | 50 | 51 | 52 | 59 | 60 | -------------------------------------------------------------------------------- /app/src/main/res/layout/box_status_user_in_commit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 16 | 24 | 25 | 32 | 40 | 41 | 49 | 50 | 51 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/box_status_website.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 26 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dlg_friendica_server_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dlg_notifications.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 21 | 27 | 28 | 29 | 35 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dlg_users.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/empty_view_user_page.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fg_photoviewer.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fg_photoviewer_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fg_timeline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/friendica_server_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 22 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/notification_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 14 | 22 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/reply_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 13 | 23 | 26 | 27 | 28 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/reply_list_item_level2.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 11 | 12 | 13 | 16 | 26 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rv_user_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 14 | 15 | 25 | 26 | 36 | 37 | 38 | 40 | 51 | 52 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rv_user_item_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 24 | 37 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/status_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 12 | 13 | 16 | 25 | 26 | 28 | 29 | 30 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/users_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 13 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/menu/index_avatar_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/status_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-de/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8dp 4 | 2dp 5 | 1dp 6 | 11sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-nl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | DiCa 3 | aanmelden 4 | afmelden 5 | gebruikersnaam 6 | wachtwoord 7 | laden..... 8 | tijdelijk niet mogelijk (%1$s) 9 | niets meer.. 10 | post 11 | bericht 12 | status opslaan 13 | status niet gevonden 14 | publiek 15 | privaat 16 | toegang weigeren 17 | toegang wijgeren 18 | foto kon niet geselecteerd worden (%1$s) 19 | terugzetten 20 | draaien 21 | bijsnijden 22 | toegang geweigerd 23 | vind ik leuk 24 | delen 25 | %1$s 26 | Antwoord op: %1$s 27 | nog geen API ondersteuning 28 | nog niet geïmplementeerd 29 | gebruiker niet gevonden 30 | %1$s mensen vinden dit leuk 31 | publiek 32 | vrienden 33 | Een eenvoudige onoffici�le Friendica-client 34 | mij 35 | meldingen 36 | markeer alle meldingen als gezien 37 | item bestaat niet 38 | favorieten 39 | favorieten 40 | geen data 41 | " - %1$s" 42 | retweet 43 | retweeting 44 | retweet mislukt (%1$s) 45 | gebruikersdata ophalen.. 46 | publiceren gelukt 47 | publiceren mislukt (%1$s) 48 | retweeten gelukt 49 | Open Link 50 | Verwijder globaal 51 | Status echt verwijderen? 52 | verwerken..... 53 | Je hebt %1$s nieuwe status 54 | Nog geen ondersteuning voor dit type zoekactie 55 | 56 | Netwerk 57 | Meer dan %1$s nieuwe status 58 | meldingen uitschakelen 59 | je hebt %1$s meldingen 60 | Iedere 15 min. updaten 61 | Je kan maximaal %1$s foto\'s uploaden 62 | Status aan het posten 63 | Media # %1$s aan het uploaden 64 | Registreren? 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh-rTW/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | DiCa 4 | 登入 5 | 登出 6 | 帳號 7 | 密碼 8 | 拼死拼活載入中 9 | 暫時無法使用 (%1$s) 10 | 沒了啦, 你看光光了喔 11 | 分享 12 | 內容 13 | 努力傳送中 14 | 找不到喔 15 | 公開 16 | 指定 17 | 你沒有授權喔 18 | 你沒有授權相機權限 19 | 無法使用照片 (%1$s) 20 | 重設 21 | 翻轉 22 | 裁切 23 | 你沒有授權定位權限 24 | %1$s 25 | 喜歡 26 | 分享 27 | 回覆: %1$s 28 | API 還不支援 29 | 功能尚未開發 30 | 找不到用戶喔 31 | %1$s 人喜歡 32 | 公開的 33 | 朋友的 34 | A simple client for Friendica 35 | 自己的 36 | 通知 37 | 全部標示已讀 38 | 找不到這個訊息囉 39 | 關注的 40 | 關注 41 | 喔喔...目前沒資料喔 42 | " - %1$s" 43 | 轉推 44 | 轉推中 45 | 轉推失敗 (%1$s) 46 | 獲取站外用戶資料 47 | 發表成功 48 | 發佈失敗 (%1$s) 49 | 轉推成功 50 | 另開連結 51 | 刪除貼文 52 | 確認刪除嗎? 53 | 處理中.... 54 | 你有 %1$s 則新訊息 55 | 56 | 不支援非圖片的搜尋 57 | 網絡的 58 | 超過 %1$s 新訊息 59 | 每15分鐘更新 60 | 不通知 61 | 你有 %1$s 則通知 62 | 最多只能上傳 %1$s 張照片 63 | 多媒體 #%1$s 上傳中 64 | 狀態發佈中... 65 | "註冊帳號 ? " 66 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @string/index_friends_timeline 5 | @string/index_public_timeline 6 | @string/index_network_public 7 | @string/index_my_timeline 8 | @string/index_favorites_timeline 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | #FFFFFF 7 | #EFEFEF 8 | #EFEFEF 9 | #880E4F 10 | #cccccc 11 | #e8eaf6 12 | #b71c1c 13 | #CCC 14 | #CCC 15 | #999 16 | #B0BEC5 17 | #9CCC65 18 | #01579B 19 | #827717 20 | #9e9d24 21 | #e1f5fe 22 | #3949AB 23 | #c1000000 24 | #AF999999 25 | #9FA8DA 26 | #EFEFEF 27 | #80d8ff 28 | #FAFAFA 29 | #B0BEC5 30 | #F5F5F5 31 | #3f51b5 32 | #c5cae9 33 | #e8eaf6 34 | #ffffff 35 | #ffffff 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 34dp 4 | 20dp 5 | 34dp 6 | 26dp 7 | 140dp 8 | 100dp 9 | 8dp 10 | 4dp 11 | 8dp 12 | 4dp 13 | 12sp 14 | 36dp 15 | 8dp 16 | 4dp 17 | 18 | 8dp 19 | 12dp 20 | 28dp 21 | 180dp 22 | 16dp 23 | 16dp 24 | 25 | 16dp 26 | 16dp 27 | 8dp 28 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 24 | 25 | 31 | 32 | 35 | 39 | --> 45 | 46 | \@menu/activity_main_menu 47 | 48 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.3.10' 5 | repositories { 6 | google() 7 | jcenter() 8 | maven { url 'https://maven.google.com' } 9 | maven { url 'https://www.mvnjar.com/central/maven2' } 10 | } 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:3.4.2' 13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | maven { url 'https://jitpack.io' } 22 | maven { url 'https://www.mvnjar.com/central/maven2' } 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # Kotlin code style for this project: "official" or "obsolete": 15 | kotlin.code.style=official 16 | android.injected.testOnly=false 17 | android.useAndroidX=true 18 | android.enableJetifier=true 19 | #android.enableAapt2=false -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasoncheng/dica/2a93536881f2edb73eab11c50f9196b68a37a8ee/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Apr 30 21:56:22 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------