···1+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2+buildscript {
3+ repositories {
4+ google()
5+ mavenCentral()
6+ }
7+ dependencies {
8+ classpath "com.android.tools.build:gradle:7.0.4"
9+10+ // NOTE: Do not place your application dependencies here; they belong
11+ // in the individual module build.gradle files
12+ }
13+}
14+15+task clean(type: Delete) {
16+ delete rootProject.buildDir
17+}
+19
gradle.properties
···0000000000000000000
···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=-Xmx2048m -Dfile.encoding=UTF-8
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+# AndroidX package structure to make it clearer which packages are bundled with the
15+# Android operating system, and which are packaged with your app"s APK
16+# https://developer.android.com/topic/libraries/support-library/androidx-rn
17+android.useAndroidX=true
18+# Automatically convert third-party libraries to use AndroidX
19+android.enableJetifier=true
···1+#!/usr/bin/env sh
2+3+#
4+# Copyright 2015 the original author or authors.
5+#
6+# Licensed under the Apache License, Version 2.0 (the "License");
7+# you may not use this file except in compliance with the License.
8+# You may obtain a copy of the License at
9+#
10+# https://www.apache.org/licenses/LICENSE-2.0
11+#
12+# Unless required by applicable law or agreed to in writing, software
13+# distributed under the License is distributed on an "AS IS" BASIS,
14+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+# See the License for the specific language governing permissions and
16+# limitations under the License.
17+#
18+19+##############################################################################
20+##
21+## Gradle start up script for UN*X
22+##
23+##############################################################################
24+25+# Attempt to set APP_HOME
26+# Resolve links: $0 may be a link
27+PRG="$0"
28+# Need this for relative symlinks.
29+while [ -h "$PRG" ] ; do
30+ ls=`ls -ld "$PRG"`
31+ link=`expr "$ls" : '.*-> \(.*\)$'`
32+ if expr "$link" : '/.*' > /dev/null; then
33+ PRG="$link"
34+ else
35+ PRG=`dirname "$PRG"`"/$link"
36+ fi
37+done
38+SAVED="`pwd`"
39+cd "`dirname \"$PRG\"`/" >/dev/null
40+APP_HOME="`pwd -P`"
41+cd "$SAVED" >/dev/null
42+43+APP_NAME="Gradle"
44+APP_BASE_NAME=`basename "$0"`
45+46+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48+49+# Use the maximum available, or set MAX_FD != -1 to use that value.
50+MAX_FD="maximum"
51+52+warn () {
53+ echo "$*"
54+}
55+56+die () {
57+ echo
58+ echo "$*"
59+ echo
60+ exit 1
61+}
62+63+# OS specific support (must be 'true' or 'false').
64+cygwin=false
65+msys=false
66+darwin=false
67+nonstop=false
68+case "`uname`" in
69+ CYGWIN* )
70+ cygwin=true
71+ ;;
72+ Darwin* )
73+ darwin=true
74+ ;;
75+ MINGW* )
76+ msys=true
77+ ;;
78+ NONSTOP* )
79+ nonstop=true
80+ ;;
81+esac
82+83+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84+85+86+# Determine the Java command to use to start the JVM.
87+if [ -n "$JAVA_HOME" ] ; then
88+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89+ # IBM's JDK on AIX uses strange locations for the executables
90+ JAVACMD="$JAVA_HOME/jre/sh/java"
91+ else
92+ JAVACMD="$JAVA_HOME/bin/java"
93+ fi
94+ if [ ! -x "$JAVACMD" ] ; then
95+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96+97+Please set the JAVA_HOME variable in your environment to match the
98+location of your Java installation."
99+ fi
100+else
101+ JAVACMD="java"
102+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103+104+Please set the JAVA_HOME variable in your environment to match the
105+location of your Java installation."
106+fi
107+108+# Increase the maximum file descriptors if we can.
109+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110+ MAX_FD_LIMIT=`ulimit -H -n`
111+ if [ $? -eq 0 ] ; then
112+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113+ MAX_FD="$MAX_FD_LIMIT"
114+ fi
115+ ulimit -n $MAX_FD
116+ if [ $? -ne 0 ] ; then
117+ warn "Could not set maximum file descriptor limit: $MAX_FD"
118+ fi
119+ else
120+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121+ fi
122+fi
123+124+# For Darwin, add options to specify how the application appears in the dock
125+if $darwin; then
126+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127+fi
128+129+# For Cygwin or MSYS, switch paths to Windows format before running java
130+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133+134+ JAVACMD=`cygpath --unix "$JAVACMD"`
135+136+ # We build the pattern for arguments to be converted via cygpath
137+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138+ SEP=""
139+ for dir in $ROOTDIRSRAW ; do
140+ ROOTDIRS="$ROOTDIRS$SEP$dir"
141+ SEP="|"
142+ done
143+ OURCYGPATTERN="(^($ROOTDIRS))"
144+ # Add a user-defined pattern to the cygpath arguments
145+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147+ fi
148+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
149+ i=0
150+ for arg in "$@" ; do
151+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153+154+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156+ else
157+ eval `echo args$i`="\"$arg\""
158+ fi
159+ i=`expr $i + 1`
160+ done
161+ case $i in
162+ 0) set -- ;;
163+ 1) set -- "$args0" ;;
164+ 2) set -- "$args0" "$args1" ;;
165+ 3) set -- "$args0" "$args1" "$args2" ;;
166+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172+ esac
173+fi
174+175+# Escape application args
176+save () {
177+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178+ echo " "
179+}
180+APP_ARGS=`save "$@"`
181+182+# Collect all arguments for the java command, following the shell quoting and substitution rules
183+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184+185+exec "$JAVACMD" "$@"
···1+@rem
2+@rem Copyright 2015 the original author or authors.
3+@rem
4+@rem Licensed under the Apache License, Version 2.0 (the "License");
5+@rem you may not use this file except in compliance with the License.
6+@rem You may obtain a copy of the License at
7+@rem
8+@rem https://www.apache.org/licenses/LICENSE-2.0
9+@rem
10+@rem Unless required by applicable law or agreed to in writing, software
11+@rem distributed under the License is distributed on an "AS IS" BASIS,
12+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+@rem See the License for the specific language governing permissions and
14+@rem limitations under the License.
15+@rem
16+17+@if "%DEBUG%" == "" @echo off
18+@rem ##########################################################################
19+@rem
20+@rem Gradle startup script for Windows
21+@rem
22+@rem ##########################################################################
23+24+@rem Set local scope for the variables with windows NT shell
25+if "%OS%"=="Windows_NT" setlocal
26+27+set DIRNAME=%~dp0
28+if "%DIRNAME%" == "" set DIRNAME=.
29+set APP_BASE_NAME=%~n0
30+set APP_HOME=%DIRNAME%
31+32+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34+35+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37+38+@rem Find java.exe
39+if defined JAVA_HOME goto findJavaFromJavaHome
40+41+set JAVA_EXE=java.exe
42+%JAVA_EXE% -version >NUL 2>&1
43+if "%ERRORLEVEL%" == "0" goto execute
44+45+echo.
46+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47+echo.
48+echo Please set the JAVA_HOME variable in your environment to match the
49+echo location of your Java installation.
50+51+goto fail
52+53+:findJavaFromJavaHome
54+set JAVA_HOME=%JAVA_HOME:"=%
55+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56+57+if exist "%JAVA_EXE%" goto execute
58+59+echo.
60+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61+echo.
62+echo Please set the JAVA_HOME variable in your environment to match the
63+echo location of your Java installation.
64+65+goto fail
66+67+:execute
68+@rem Setup the command line
69+70+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71+72+73+@rem Execute Gradle
74+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75+76+:end
77+@rem End local scope for the variables with windows NT shell
78+if "%ERRORLEVEL%"=="0" goto mainEnd
79+80+:fail
81+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82+rem the _cmd.exe /c_ return code!
83+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84+exit /b 1
85+86+:mainEnd
87+if "%OS%"=="Windows_NT" endlocal
88+89+:omega
···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
···1+package org.joinmastodon.android.model;
2+3+import org.joinmastodon.android.api.ObjectValidationException;
4+import org.joinmastodon.android.api.RequiredField;
5+6+import java.time.Instant;
7+import java.time.LocalDate;
8+import java.util.List;
9+10+/**
11+ * Represents a user of Mastodon and their associated profile.
12+ */
13+public class Account extends BaseModel{
14+ // Base attributes
15+16+ /**
17+ * The account id
18+ */
19+ @RequiredField
20+ public String id;
21+ /**
22+ * The username of the account, not including domain.
23+ */
24+ @RequiredField
25+ public String username;
26+ /**
27+ * The Webfinger account URI. Equal to username for local users, or username@domain for remote users.
28+ */
29+ @RequiredField
30+ public String acct;
31+ /**
32+ * The location of the user's profile page.
33+ */
34+ @RequiredField
35+ public String url;
36+37+ // Display attributes
38+39+ /**
40+ * The profile's display name.
41+ */
42+ @RequiredField
43+ public String displayName;
44+ /**
45+ * The profile's bio / description.
46+ */
47+ @RequiredField
48+ public String note;
49+ /**
50+ * An image icon that is shown next to statuses and in the profile.
51+ */
52+ @RequiredField
53+ public String avatar;
54+ /**
55+ * A static version of the avatar. Equal to avatar if its value is a static image; different if avatar is an animated GIF.
56+ */
57+ public String avatarStatic;
58+ /**
59+ * An image banner that is shown above the profile and in profile cards.
60+ */
61+ @RequiredField
62+ public String header;
63+ /**
64+ * A static version of the header. Equal to header if its value is a static image; different if header is an animated GIF.
65+ */
66+ public String headerStatic;
67+ /**
68+ * Whether the account manually approves follow requests.
69+ */
70+ public boolean locked;
71+ /**
72+ * Custom emoji entities to be used when rendering the profile. If none, an empty array will be returned.
73+ */
74+ public List<Emoji> emojis;
75+ /**
76+ * Whether the account has opted into discovery features such as the profile directory.
77+ */
78+ public boolean discoverable;
79+80+ // Statistical attributes
81+82+ /**
83+ * When the account was created.
84+ */
85+ @RequiredField
86+ public Instant createdAt;
87+ /**
88+ * When the most recent status was posted.
89+ */
90+// @RequiredField
91+ public LocalDate lastStatusAt;
92+ /**
93+ * How many statuses are attached to this account.
94+ */
95+ public int statusesCount;
96+ /**
97+ * The reported followers of this profile.
98+ */
99+ public int followersCount;
100+ /**
101+ * The reported follows of this profile.
102+ */
103+ public int followingCount;
104+105+ // Optional attributes
106+107+ /**
108+ * Indicates that the profile is currently inactive and that its user has moved to a new account.
109+ */
110+ public Account moved;
111+ /**
112+ * Additional metadata attached to a profile as name-value pairs.
113+ */
114+ public List<AccountField> fields;
115+ /**
116+ * A presentational flag. Indicates that the account may perform automated actions, may not be monitored, or identifies as a robot.
117+ */
118+ public boolean bot;
119+ /**
120+ * An extra entity to be used with API methods to verify credentials and update credentials.
121+ */
122+ public Source source;
123+ /**
124+ * An extra entity returned when an account is suspended.
125+ */
126+ public boolean suspended;
127+ /**
128+ * When a timed mute will expire, if applicable.
129+ */
130+ public Instant muteExpiresAt;
131+132+133+ @Override
134+ public void postprocess() throws ObjectValidationException{
135+ super.postprocess();
136+ if(fields!=null){
137+ for(AccountField f:fields)
138+ f.postprocess();
139+ }
140+ if(emojis!=null){
141+ for(Emoji e:emojis)
142+ e.postprocess();
143+ }
144+ if(moved!=null)
145+ moved.postprocess();
146+ }
147+148+ @Override
149+ public String toString(){
150+ return "Account{"+
151+ "id='"+id+'\''+
152+ ", username='"+username+'\''+
153+ ", acct='"+acct+'\''+
154+ ", url='"+url+'\''+
155+ ", displayName='"+displayName+'\''+
156+ ", note='"+note+'\''+
157+ ", avatar='"+avatar+'\''+
158+ ", avatarStatic='"+avatarStatic+'\''+
159+ ", header='"+header+'\''+
160+ ", headerStatic='"+headerStatic+'\''+
161+ ", locked="+locked+
162+ ", emojis="+emojis+
163+ ", discoverable="+discoverable+
164+ ", createdAt="+createdAt+
165+ ", lastStatusAt="+lastStatusAt+
166+ ", statusesCount="+statusesCount+
167+ ", followersCount="+followersCount+
168+ ", followingCount="+followingCount+
169+ ", moved="+moved+
170+ ", fields="+fields+
171+ ", bot="+bot+
172+ ", source="+source+
173+ ", suspended="+suspended+
174+ ", muteExpiresAt="+muteExpiresAt+
175+ '}';
176+ }
177+}
···1+package org.joinmastodon.android.model;
2+3+import org.joinmastodon.android.api.RequiredField;
4+5+import java.time.Instant;
6+7+/**
8+ * Represents a profile field as a name-value pair with optional verification.
9+ */
10+public class AccountField extends BaseModel{
11+ /**
12+ * The key of a given field's key-value pair.
13+ */
14+ @RequiredField
15+ public String name;
16+ /**
17+ * The value associated with the name key.
18+ */
19+ @RequiredField
20+ public String value;
21+ /**
22+ * Timestamp of when the server verified a URL value for a rel="me” link.
23+ */
24+ public Instant verifiedAt;
25+}
···1+package org.joinmastodon.android.model;
2+3+import org.joinmastodon.android.api.RequiredField;
4+5+/**
6+ * Represents a custom emoji.
7+ */
8+public class Emoji extends BaseModel{
9+ /**
10+ * The name of the custom emoji.
11+ */
12+ @RequiredField
13+ public String shortcode;
14+ /**
15+ * A link to the custom emoji.
16+ */
17+ @RequiredField
18+ public String url;
19+ /**
20+ * A link to a static copy of the custom emoji.
21+ */
22+ @RequiredField
23+ public String staticUrl;
24+ /**
25+ * Whether this Emoji should be visible in the picker or unlisted.
26+ */
27+ @RequiredField
28+ public boolean visibleInPicker;
29+ /**
30+ * Used for sorting custom emoji in the picker.
31+ */
32+ public String category;
33+}
···1+package org.joinmastodon.android.model;
2+3+import org.joinmastodon.android.api.ObjectValidationException;
4+import org.joinmastodon.android.api.RequiredField;
5+6+import java.util.List;
7+8+/**
9+ * Represents display or publishing preferences of user's own account. Returned as an additional entity when verifying and updated credentials, as an attribute of Account.
10+ */
11+public class Source extends BaseModel{
12+ /**
13+ * Profile bio.
14+ */
15+ @RequiredField
16+ public String note;
17+ /**
18+ * Metadata about the account.
19+ */
20+ @RequiredField
21+ public List<AccountField> fields;
22+ /**
23+ * The default post privacy to be used for new statuses.
24+ */
25+ public StatusPrivacy privacy;
26+ /**
27+ * Whether new statuses should be marked sensitive by default.
28+ */
29+ public boolean sensitive;
30+ /**
31+ * The default posting language for new statuses.
32+ */
33+ public String language;
34+ /**
35+ * The number of pending follow requests.
36+ */
37+ public int followRequestCount;
38+39+ @Override
40+ public void postprocess() throws ObjectValidationException{
41+ super.postprocess();
42+ for(AccountField f:fields)
43+ f.postprocess();
44+ }
45+}
···1+package org.joinmastodon.android.model;
2+3+import org.joinmastodon.android.api.AllFieldsAreRequired;
4+5+/**
6+ * Represents an OAuth token used for authenticating with the API and performing actions.
7+ */
8+@AllFieldsAreRequired
9+public class Token extends BaseModel{
10+ /**
11+ * An OAuth token to be used for authorization.
12+ */
13+ public String accessToken;
14+ /**
15+ * The OAuth token type. Mastodon uses Bearer tokens.
16+ */
17+ public String tokenType;
18+ /**
19+ * The OAuth scopes granted by this token, space-separated.
20+ */
21+ public String scope;
22+ /**
23+ * When the token was generated.
24+ * (unixtime)
25+ */
26+ public long createdAt;
27+}