diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 62955811e..99e67606c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -59,6 +59,7 @@
+
diff --git a/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.java b/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.java
new file mode 100644
index 000000000..5475a0d4e
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.java
@@ -0,0 +1,130 @@
+package com.keylesspalace.tusky;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.ActionBar;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.keylesspalace.tusky.entity.Account;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class EditProfileActivity extends BaseActivity {
+ private static final String TAG = "EditProfileActivity";
+
+ @BindView(R.id.edit_profile_display_name) EditText displayNameEditText;
+ @BindView(R.id.edit_profile_note) EditText noteEditText;
+ @BindView(R.id.edit_profile_avatar) Button avatarButton;
+ @BindView(R.id.edit_profile_header) Button headerButton;
+
+ private String priorDisplayName;
+ private String priorNote;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_edit_profile);
+ ButterKnife.bind(this);
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle(null);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ }
+
+ if (savedInstanceState != null) {
+ priorDisplayName = savedInstanceState.getString("priorDisplayName");
+ priorNote = savedInstanceState.getString("priorNote");
+ } else {
+ priorDisplayName = null;
+ priorNote = null;
+ }
+
+ mastodonAPI.accountVerifyCredentials().enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, Response response) {
+ if (!response.isSuccessful()) {
+ onAccountVerifyCredentialsFailed();
+ return;
+ }
+ Account me = response.body();
+ priorDisplayName = me.getDisplayName();
+ priorNote = me.note.toString();
+ displayNameEditText.setText(priorDisplayName);
+ noteEditText.setText(HtmlUtils.fromHtml(priorNote));
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable t) {
+ onAccountVerifyCredentialsFailed();
+ }
+ });
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ outState.putString("priorDisplayName", priorDisplayName);
+ outState.putString("priorNote", priorNote);
+ super.onSaveInstanceState(outState);
+ }
+
+ private void onAccountVerifyCredentialsFailed() {
+ Log.e(TAG, "The account failed to load.");
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.edit_profile_toolbar, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ onBackPressed();
+ return true;
+ }
+ case R.id.action_save: {
+ save();
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void save() {
+ String newDisplayName = displayNameEditText.getText().toString();
+ if (newDisplayName.isEmpty()) {
+ displayNameEditText.setError(getString(R.string.error_empty));
+ return;
+ }
+ if (priorDisplayName != null && priorDisplayName.equals(newDisplayName)) {
+ // If it's not any different, don't patch it.
+ newDisplayName = null;
+ }
+
+ String newNote = HtmlUtils.toHtml(noteEditText.getText());
+ if (newNote.isEmpty()) {
+ noteEditText.setError(getString(R.string.error_empty));
+ return;
+ }
+ if (priorNote != null && priorNote.equals(newNote)) {
+ // If it's not any different, don't patch it.
+ newNote = null;
+ }
+
+ mastodonAPI.accountUpdateCredentials(newDisplayName, newNote, null, null);
+ }
+}
diff --git a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
index e4695dd7e..b1996d19e 100644
--- a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
@@ -110,26 +110,6 @@ public class LoginActivity extends AppCompatActivity {
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
});
-
- // Apply any updates needed.
- int versionCode = 1;
- try {
- versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "The app version was not found. " + e.getMessage());
- }
- if (preferences.getInt("lastUpdateVersion", 0) != versionCode) {
- SharedPreferences.Editor editor = preferences.edit();
- if (versionCode == 14) {
- /* This version switches the order of scheme and host in the OAuth redirect URI.
- * But to fix it requires forcing the app to re-authenticate with servers. So, clear
- * out the stored client id/secret pairs. The only other things that are lost are
- * "rememberedVisibility", "loggedInUsername", and "loggedInAccountId". */
- editor.clear();
- }
- editor.putInt("lastUpdateVersion", versionCode);
- editor.apply();
- }
}
@Override
diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
index 434152697..bd4326ed2 100644
--- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
@@ -261,7 +261,7 @@ public class MainActivity extends BaseActivity {
.withHasStableIds(true)
.withSelectedItem(-1)
.addDrawerItems(
- new PrimaryDrawerItem().withIdentifier(0).withName(R.string.action_view_profile).withSelectable(false).withIcon(GoogleMaterial.Icon.gmd_person),
+ new PrimaryDrawerItem().withIdentifier(0).withName(getString(R.string.action_edit_profile)).withSelectable(false).withIcon(GoogleMaterial.Icon.gmd_person),
new PrimaryDrawerItem().withIdentifier(1).withName(getString(R.string.action_view_favourites)).withSelectable(false).withIcon(GoogleMaterial.Icon.gmd_star),
new PrimaryDrawerItem().withIdentifier(2).withName(getString(R.string.action_view_blocks)).withSelectable(false).withIcon(GoogleMaterial.Icon.gmd_block),
new DividerDrawerItem(),
@@ -275,11 +275,8 @@ public class MainActivity extends BaseActivity {
long drawerItemIdentifier = drawerItem.getIdentifier();
if (drawerItemIdentifier == 0) {
- if (loggedInAccountId != null) {
- Intent intent = new Intent(MainActivity.this, AccountActivity.class);
- intent.putExtra("id", loggedInAccountId);
- startActivity(intent);
- }
+ Intent intent = new Intent(MainActivity.this, EditProfileActivity.class);
+ startActivity(intent);
} else if (drawerItemIdentifier == 1) {
Intent intent = new Intent(MainActivity.this, FavouritesActivity.class);
startActivity(intent);
diff --git a/app/src/main/res/layout/activity_edit_profile.xml b/app/src/main/res/layout/activity_edit_profile.xml
new file mode 100644
index 000000000..d861a91d4
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_profile.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/edit_profile_toolbar.xml b/app/src/main/res/menu/edit_profile_toolbar.xml
new file mode 100644
index 000000000..3f7f19bdb
--- /dev/null
+++ b/app/src/main/res/menu/edit_profile_toolbar.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7d053474e..36f22fc39 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -15,6 +15,7 @@
Images and videos cannot both be attached to the same status.
The upload failed.
At least one status must be reported.
+ This cannot be empty.
Home
Notifications
@@ -85,6 +86,8 @@
Options
Open drawer
Clear
+ Save
+ Edit profile
Share toot URL to…
@@ -96,6 +99,11 @@
Which instance?
What\'s happening?
Content warning
+ Display name
+ Bio
+
+ Avatar
+ Header
What\'s an instance?