diff --git a/.project b/.project new file mode 100644 index 0000000..3964dd3 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 395523f..4726443 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,7 +47,8 @@ android:label="@string/title_activity_settings" /> + android:theme="@style/AppTheme.NoActionBar" + android:label="Push message"> diff --git a/app/src/main/java/com/github/gotify/Utils.java b/app/src/main/java/com/github/gotify/Utils.java index 9ef319e..fb9df51 100644 --- a/app/src/main/java/com/github/gotify/Utils.java +++ b/app/src/main/java/com/github/gotify/Utils.java @@ -1,14 +1,12 @@ package com.github.gotify; import android.app.Activity; -import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.format.DateUtils; import android.view.View; -import android.widget.Toast; import androidx.annotation.NonNull; import com.github.gotify.client.JSON; import com.github.gotify.log.Log; @@ -103,11 +101,6 @@ public class Utils { if (data.length != 1) { throw new IllegalArgumentException("must be one element"); } - return data[0]; } - - public static void showLongToast(Context context, String message) { - Toast.makeText(context, message, Toast.LENGTH_LONG).show(); - } } diff --git a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java index 16ceb16..3f9224b 100644 --- a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java +++ b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java @@ -62,6 +62,7 @@ import com.github.gotify.messages.provider.MessageWithImage; import com.github.gotify.picasso.PicassoHandler; import com.github.gotify.service.WebSocketService; import com.github.gotify.settings.SettingsActivity; +import com.github.gotify.sharing.ShareActivity; import com.google.android.material.navigation.NavigationView; import com.google.android.material.snackbar.BaseTransientBottomBar; import com.google.android.material.snackbar.Snackbar; @@ -301,6 +302,9 @@ public class MessagesActivity extends AppCompatActivity startActivity(new Intent(this, LogsActivity.class)); } else if (id == R.id.settings) { startActivity(new Intent(this, SettingsActivity.class)); + } else if (id == R.id.push_message) { + Intent intent = new Intent(MessagesActivity.this, ShareActivity.class); + startActivity(intent); } drawer.closeDrawer(GravityCompat.START); diff --git a/app/src/main/java/com/github/gotify/sharing/ShareActivity.java b/app/src/main/java/com/github/gotify/sharing/ShareActivity.java index c6dbe4b..065a096 100644 --- a/app/src/main/java/com/github/gotify/sharing/ShareActivity.java +++ b/app/src/main/java/com/github/gotify/sharing/ShareActivity.java @@ -1,82 +1,141 @@ package com.github.gotify.sharing; -import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import com.github.gotify.R; import com.github.gotify.Settings; -import com.github.gotify.Utils; import com.github.gotify.api.Api; import com.github.gotify.api.ApiException; import com.github.gotify.api.ClientFactory; import com.github.gotify.client.ApiClient; -import com.github.gotify.client.api.ApplicationApi; import com.github.gotify.client.api.MessageApi; import com.github.gotify.client.model.Application; import com.github.gotify.client.model.Message; import com.github.gotify.log.Log; +import com.github.gotify.messages.provider.ApplicationHolder; +import java.util.ArrayList; import java.util.List; import static com.github.gotify.Utils.first; -public class ShareActivity extends Activity { - private ApiClient client; +public class ShareActivity extends AppCompatActivity { private Settings settings; + private ApplicationHolder appsHolder; + + @BindView(R.id.title) + EditText edtTxtTitle; + + @BindView(R.id.content) + EditText edtTxtContent; + + @BindView(R.id.edtTxtPriority) + EditText edtTxtPriority; + + @BindView(R.id.appSpinner) + Spinner appSpinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_share); + ButterKnife.bind(this); + + Log.i("Entering " + getClass().getSimpleName()); + setSupportActionBar(findViewById(R.id.toolbar)); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowCustomEnabled(true); + } settings = new Settings(this); - handleShareIntent(); - } - private void handleShareIntent() { Intent intent = getIntent(); - String action = intent.getAction(); String type = intent.getType(); - - if (Intent.ACTION_SEND.equals(action) && type != null) { - if ("text/plain".equals(type)) { - String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); - if (sharedText != null) { - Message message = new Message(); - message.setMessage(sharedText); - message.setTitle("Shared content"); - message.setPriority((long) 5); - - client = - ClientFactory.clientToken( - settings.url(), settings.sslSettings(), settings.token()); - - new GetApps().execute(message); - } + if (Intent.ACTION_SEND.equals(intent.getAction()) && "text/plain".equals(type)) { + String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); + if (sharedText != null) { + edtTxtContent.setText(sharedText); } } + + ApiClient client = + ClientFactory.clientToken(settings.url(), settings.sslSettings(), settings.token()); + appsHolder = new ApplicationHolder(this, client); + appsHolder.onUpdate(() -> populateSpinner(appsHolder.get())); + appsHolder.request(); } - private class GetApps extends AsyncTask { - @Override - protected Void doInBackground(Message... messages) { - try { - ApplicationApi applicationApi = client.createService(ApplicationApi.class); - List apps = Api.execute(applicationApi.getApps()); - client = - ClientFactory.clientToken( - settings.url(), settings.sslSettings(), apps.get(0).getToken()); - new SendSharedContent().execute(first(messages)); - } catch (ApiException apiException) { - Log.e("Failed getting apps", apiException); - } - - return null; + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); } + return super.onOptionsItemSelected(item); } - private class SendSharedContent extends AsyncTask { + @OnClick(R.id.push_button) + public void pushMessage(View view) { + String titleText = edtTxtTitle.getText().toString(); + String contentText = edtTxtContent.getText().toString(); + String priority = edtTxtPriority.getText().toString(); + int appIndex = appSpinner.getSelectedItemPosition(); + + if (contentText.isEmpty()) { + Toast.makeText(this, "Content should not be empty.", Toast.LENGTH_LONG).show(); + return; + } else if (priority.isEmpty()) { + Toast.makeText(this, "Priority should be number.", Toast.LENGTH_LONG).show(); + return; + } + + Message message = new Message(); + if (!titleText.isEmpty()) { + message.setTitle(titleText); + } + message.setMessage(contentText); + message.setPriority(Long.parseLong(priority)); + new PushMessage(appsHolder.get().get(appIndex).getToken()).execute(message); + } + + private void populateSpinner(List apps) { + List appNameList = new ArrayList<>(); + for (Application app : apps) { + appNameList.add(app.getName()); + } + + ArrayAdapter adapter = + new ArrayAdapter<>( + this, android.R.layout.simple_spinner_dropdown_item, appNameList); + appSpinner.setAdapter(adapter); + } + + private class PushMessage extends AsyncTask { + private String token; + + public PushMessage(String token) { + this.token = token; + } + @Override protected String doInBackground(Message... messages) { + List apps = appsHolder.get(); + ApiClient pushClient = + ClientFactory.clientToken(settings.url(), settings.sslSettings(), token); + try { - MessageApi messageApi = client.createService(MessageApi.class); + MessageApi messageApi = pushClient.createService(MessageApi.class); Api.execute(messageApi.createMessage(first(messages))); return "Pushed!"; } catch (ApiException apiException) { @@ -87,7 +146,7 @@ public class ShareActivity extends Activity { @Override protected void onPostExecute(String message) { - Utils.showLongToast(ShareActivity.this, message); + Toast.makeText(ShareActivity.this, message, Toast.LENGTH_LONG).show(); ShareActivity.this.finish(); } } diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 0000000..ac34cb9 --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml index a087c86..af2a382 100644 --- a/app/src/main/res/drawable/ic_settings.xml +++ b/app/src/main/res/drawable/ic_settings.xml @@ -1,5 +1,7 @@ + android:viewportWidth="20" + android:width="24dp" + xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml new file mode 100644 index 0000000..1c20d6b --- /dev/null +++ b/app/src/main/res/layout/activity_share.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +