From bd77de011dda29419fdf4901acade4ad2074f8e7 Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sun, 18 Oct 2020 19:51:43 +0200 Subject: [PATCH] added user list editor --- .idea/assetWizardSettings.xml | 4 +- app/src/main/AndroidManifest.xml | 5 + .../nuclearfog/twidda/activity/ListPopup.java | 106 ++++++++++++++++++ .../twidda/activity/TwitterList.java | 21 ++++ .../twidda/backend/UserListUpdater.java | 60 ++++++++++ .../twidda/backend/engine/TwitterEngine.java | 18 +++ .../twidda/backend/holder/ListHolder.java | 45 ++++++++ app/src/main/res/drawable/new_list.xml | 10 ++ app/src/main/res/layout/popup_userlist.xml | 81 +++++++++++++ app/src/main/res/menu/lists.xml | 10 ++ app/src/main/res/values-de-rDE/strings.xml | 8 ++ app/src/main/res/values/dimens.xml | 9 ++ app/src/main/res/values/strings.xml | 8 ++ 13 files changed, 383 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java create mode 100644 app/src/main/java/org/nuclearfog/twidda/backend/UserListUpdater.java create mode 100644 app/src/main/java/org/nuclearfog/twidda/backend/holder/ListHolder.java create mode 100644 app/src/main/res/drawable/new_list.xml create mode 100644 app/src/main/res/layout/popup_userlist.xml create mode 100644 app/src/main/res/menu/lists.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 32dffece..85c1adcb 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -20,8 +20,8 @@ - - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6b047645..c649b65c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,6 +109,11 @@ android:screenOrientation="portrait" android:theme="@style/AppTheme" /> + + \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java new file mode 100644 index 00000000..a80c643e --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java @@ -0,0 +1,106 @@ +package org.nuclearfog.twidda.activity; + +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import org.nuclearfog.twidda.R; +import org.nuclearfog.twidda.backend.UserListUpdater; +import org.nuclearfog.twidda.backend.engine.EngineException; +import org.nuclearfog.twidda.backend.holder.ListHolder; +import org.nuclearfog.twidda.backend.utils.ErrorHandler; +import org.nuclearfog.twidda.database.GlobalSettings; + +import static android.os.AsyncTask.Status.RUNNING; +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; +import static org.nuclearfog.twidda.activity.TwitterList.RET_LIST_CREATED; + +public class ListPopup extends AppCompatActivity implements OnClickListener { + + public static final String KEY_LIST_ID = "list_id"; + public static final String KEY_LIST_TITLE = "list_title"; + public static final String KEY_LIST_DESCR = "list_description"; + public static final String KEY_LIST_VISIB = "list_visibility"; + + private UserListUpdater updaterAsync; + private EditText title, description; + private CompoundButton visibility; + private View progressCircle; + + @Override + protected void onCreate(Bundle b) { + super.onCreate(b); + setContentView(R.layout.popup_userlist); + View root = findViewById(R.id.list_popup_root); + Button update = findViewById(R.id.userlist_create_list); + title = findViewById(R.id.list_edit_title); + description = findViewById(R.id.list_edit_descr); + visibility = findViewById(R.id.list_edit_public_sw); + progressCircle = findViewById(R.id.list_popup_loading); + + GlobalSettings settings = GlobalSettings.getInstance(this); + root.setBackgroundColor(settings.getPopupColor()); + Bundle extras = getIntent().getExtras(); + if (extras != null) { + title.setText(extras.getString(KEY_LIST_TITLE, "")); + description.setText(extras.getString(KEY_LIST_DESCR, "")); + visibility.setChecked(extras.getBoolean(KEY_LIST_VISIB, true)); + } + update.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + if (view.getId() == R.id.userlist_create_list) { + String titleStr = title.getText().toString(); + String descrStr = description.getText().toString(); + boolean isPublic = visibility.isChecked(); + if (titleStr.trim().isEmpty() || descrStr.trim().isEmpty()) { + Toast.makeText(this, R.string.userlist_error_empty_text, Toast.LENGTH_SHORT).show(); + } else if (updaterAsync == null || updaterAsync.getStatus() != RUNNING) { + Bundle extras = getIntent().getExtras(); + ListHolder mHolder; + if (extras != null && extras.containsKey(KEY_LIST_ID)) { + long id = extras.getLong(KEY_LIST_ID); + mHolder = new ListHolder(titleStr, descrStr, isPublic, id); + } else { + mHolder = new ListHolder(titleStr, descrStr, isPublic); + } + updaterAsync = new UserListUpdater(this); + updaterAsync.execute(mHolder); + } + } + } + + + public void startLoading() { + progressCircle.setVisibility(VISIBLE); + } + + + public void onSuccess() { + Bundle extras = getIntent().getExtras(); + if (extras != null && extras.containsKey(KEY_LIST_ID)) { + Toast.makeText(this, R.string.info_list_updated, Toast.LENGTH_SHORT).show(); + } else { + // if no list ID is defined, it's a new list + Toast.makeText(this, R.string.info_list_created, Toast.LENGTH_SHORT).show(); + setResult(RET_LIST_CREATED); + } + finish(); + } + + + public void onError(EngineException err) { + if (err != null) + ErrorHandler.handleFailure(this, err); + progressCircle.setVisibility(INVISIBLE); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TwitterList.java b/app/src/main/java/org/nuclearfog/twidda/activity/TwitterList.java index ec858bcf..51ee7737 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TwitterList.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TwitterList.java @@ -1,8 +1,12 @@ package org.nuclearfog.twidda.activity; +import android.content.Intent; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -18,6 +22,8 @@ import org.nuclearfog.twidda.database.GlobalSettings; */ public class TwitterList extends AppCompatActivity { + public static final int REQ_CREATE_LIST = 1; + public static final int RET_LIST_CREATED = 2; public static final String KEY_USERLIST_OWNER_ID = "userlist-owner-id"; public static final String KEY_USERLIST_OWNER_NAME = "userlist-owner-name"; @@ -50,4 +56,19 @@ public class TwitterList extends AppCompatActivity { } } } + + @Override + public boolean onCreateOptionsMenu(Menu m) { + getMenuInflater().inflate(R.menu.lists, m); + return super.onCreateOptionsMenu(m); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == R.id.list_create) { + Intent createList = new Intent(this, ListPopup.class); + startActivityForResult(createList, REQ_CREATE_LIST); + } + return super.onOptionsItemSelected(item); + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/UserListUpdater.java b/app/src/main/java/org/nuclearfog/twidda/backend/UserListUpdater.java new file mode 100644 index 00000000..e8ee0abc --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/UserListUpdater.java @@ -0,0 +1,60 @@ +package org.nuclearfog.twidda.backend; + +import android.os.AsyncTask; + +import androidx.annotation.Nullable; + +import org.nuclearfog.twidda.activity.ListPopup; +import org.nuclearfog.twidda.backend.engine.EngineException; +import org.nuclearfog.twidda.backend.engine.TwitterEngine; +import org.nuclearfog.twidda.backend.holder.ListHolder; + +import java.lang.ref.WeakReference; + +public class UserListUpdater extends AsyncTask { + + private final WeakReference callback; + + @Nullable + private EngineException err; + private final TwitterEngine mTwitter; + + + public UserListUpdater(ListPopup activity) { + super(); + callback = new WeakReference<>(activity); + mTwitter = TwitterEngine.getInstance(activity); + } + + + @Override + protected void onPreExecute() { + if (callback.get() != null) { + callback.get().startLoading(); + } + } + + + @Override + protected Boolean doInBackground(ListHolder... listHolders) { + try { + mTwitter.updateUserList(listHolders[0]); + return true; + } catch (EngineException err) { + this.err = err; + } + return false; + } + + + @Override + protected void onPostExecute(Boolean success) { + if (callback.get() != null) { + if (success) { + callback.get().onSuccess(); + } else { + callback.get().onError(err); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java index 1f09841d..995c32e9 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java @@ -7,6 +7,7 @@ import android.graphics.BitmapFactory; import androidx.annotation.Nullable; import org.nuclearfog.twidda.BuildConfig; +import org.nuclearfog.twidda.backend.holder.ListHolder; import org.nuclearfog.twidda.backend.holder.MessageHolder; import org.nuclearfog.twidda.backend.holder.TweetHolder; import org.nuclearfog.twidda.backend.holder.TwitterUserList; @@ -1058,6 +1059,23 @@ public class TwitterEngine { } } + /** + * creates an user list + * + * @param list holder for list information + * @throws EngineException if access is unavailable + */ + public void updateUserList(ListHolder list) throws EngineException { + try { + if (list.exists()) { + twitter.updateUserList(list.getId(), list.getTitle(), list.isPublic(), list.getDescription()); + } else { + twitter.createUserList(list.getTitle(), list.isPublic(), list.getDescription()); + } + } catch (TwitterException err) { + throw new EngineException(err); + } + } /** * convert #twitter4j.User to TwitterUser List diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/holder/ListHolder.java b/app/src/main/java/org/nuclearfog/twidda/backend/holder/ListHolder.java new file mode 100644 index 00000000..2d3759c8 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/holder/ListHolder.java @@ -0,0 +1,45 @@ +package org.nuclearfog.twidda.backend.holder; + +public class ListHolder { + + public static final long NEW_LIST = -1; + + private long listId; + private final String title; + private final String description; + private final boolean isPublic; + + + public ListHolder(String title, String description, boolean isPublic, long listId) { + this(title, description, isPublic); + this.listId = listId; + } + + + public ListHolder(String title, String description, boolean isPublic) { + this.title = title; + this.description = description; + this.isPublic = isPublic; + this.listId = NEW_LIST; + } + + public long getId() { + return listId; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public boolean isPublic() { + return isPublic; + } + + public boolean exists() { + return listId != -1; + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/new_list.xml b/app/src/main/res/drawable/new_list.xml new file mode 100644 index 00000000..98d3fcc2 --- /dev/null +++ b/app/src/main/res/drawable/new_list.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/popup_userlist.xml b/app/src/main/res/layout/popup_userlist.xml new file mode 100644 index 00000000..3fbf46a5 --- /dev/null +++ b/app/src/main/res/layout/popup_userlist.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + +