Support URLs with path prefix (#46)

See gotify/server#127 gotify/server#122
This commit is contained in:
饺子w
2019-02-18 02:05:30 +08:00
committed by Jannis Mattheis
parent f74e79232b
commit 67daf8dc2f
4 changed files with 36 additions and 7 deletions

View File

@@ -18,6 +18,10 @@ import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import okio.Buffer; import okio.Buffer;
import org.threeten.bp.OffsetDateTime; import org.threeten.bp.OffsetDateTime;
@@ -36,6 +40,22 @@ public class Utils {
.toString(); .toString();
} }
public static String resolveAbsoluteUrl(String baseURL, String target) {
if (target == null) {
return null;
}
try {
URI targetUri = new URI(target);
if (targetUri.isAbsolute()) {
return target;
}
return new URL(new URL(baseURL), target).toString();
} catch (MalformedURLException | URISyntaxException e) {
Log.e("Could not resolve absolute url", e);
return target;
}
}
public static Target toDrawable(Resources resources, DrawableReceiver drawableReceiver) { public static Target toDrawable(Resources resources, DrawableReceiver drawableReceiver) {
return new Target() { return new Target() {
@Override @Override

View File

@@ -11,12 +11,12 @@ import com.github.gotify.client.auth.HttpBasicAuth;
public class ClientFactory { public class ClientFactory {
public static com.github.gotify.client.ApiClient unauthorized( public static com.github.gotify.client.ApiClient unauthorized(
String baseUrl, SSLSettings sslSettings) { String baseUrl, SSLSettings sslSettings) {
return defaultClient(new String[0], baseUrl, sslSettings); return defaultClient(new String[0], baseUrl + "/", sslSettings);
} }
public static ApiClient basicAuth( public static ApiClient basicAuth(
String baseUrl, SSLSettings sslSettings, String username, String password) { String baseUrl, SSLSettings sslSettings, String username, String password) {
ApiClient client = defaultClient(new String[] {"basicAuth"}, baseUrl, sslSettings); ApiClient client = defaultClient(new String[] {"basicAuth"}, baseUrl + "/", sslSettings);
HttpBasicAuth auth = (HttpBasicAuth) client.getApiAuthorizations().get("basicAuth"); HttpBasicAuth auth = (HttpBasicAuth) client.getApiAuthorizations().get("basicAuth");
auth.setUsername(username); auth.setUsername(username);
auth.setPassword(password); auth.setPassword(password);
@@ -24,7 +24,8 @@ public class ClientFactory {
} }
public static ApiClient clientToken(String baseUrl, SSLSettings sslSettings, String token) { public static ApiClient clientToken(String baseUrl, SSLSettings sslSettings, String token) {
ApiClient client = defaultClient(new String[] {"clientTokenHeader"}, baseUrl, sslSettings); ApiClient client =
defaultClient(new String[] {"clientTokenHeader"}, baseUrl + "/", sslSettings);
ApiKeyAuth tokenAuth = (ApiKeyAuth) client.getApiAuthorizations().get("clientTokenHeader"); ApiKeyAuth tokenAuth = (ApiKeyAuth) client.getApiAuthorizations().get("clientTokenHeader");
tokenAuth.setApiKey(token); tokenAuth.setApiKey(token);
return client; return client;

View File

@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import com.github.gotify.R; import com.github.gotify.R;
import com.github.gotify.Settings;
import com.github.gotify.Utils; import com.github.gotify.Utils;
import com.github.gotify.client.model.Message; import com.github.gotify.client.model.Message;
import com.github.gotify.messages.provider.MessageWithImage; import com.github.gotify.messages.provider.MessageWithImage;
@@ -24,11 +25,17 @@ public class ListMessageAdapter extends BaseAdapter {
private Picasso picasso; private Picasso picasso;
private List<MessageWithImage> items; private List<MessageWithImage> items;
private Delete delete; private Delete delete;
private Settings settings;
ListMessageAdapter( ListMessageAdapter(
Context context, Picasso picasso, List<MessageWithImage> items, Delete delete) { Context context,
Settings settings,
Picasso picasso,
List<MessageWithImage> items,
Delete delete) {
super(); super();
this.content = context; this.content = context;
this.settings = settings;
this.picasso = picasso; this.picasso = picasso;
this.items = items; this.items = items;
this.delete = delete; this.delete = delete;
@@ -65,7 +72,7 @@ public class ListMessageAdapter extends BaseAdapter {
final MessageWithImage message = items.get(position); final MessageWithImage message = items.get(position);
holder.message.setText(message.message.getMessage()); holder.message.setText(message.message.getMessage());
holder.title.setText(message.message.getTitle()); holder.title.setText(message.message.getTitle());
picasso.load(message.image) picasso.load(Utils.resolveAbsoluteUrl(settings.url() + "/", message.image))
.error(R.drawable.ic_alarm) .error(R.drawable.ic_alarm)
.placeholder(R.drawable.ic_placeholder) .placeholder(R.drawable.ic_placeholder)
.into(holder.image); .into(holder.image);

View File

@@ -125,7 +125,8 @@ public class MessagesActivity extends AppCompatActivity
messages = new MessageFacade(client.createService(MessageApi.class), appsHolder); messages = new MessageFacade(client.createService(MessageApi.class), appsHolder);
messagesView.setOnScrollListener(this); messagesView.setOnScrollListener(this);
messagesView.setAdapter(new ListMessageAdapter(this, picasso, emptyList(), this::delete)); messagesView.setAdapter(
new ListMessageAdapter(this, settings, picasso, emptyList(), this::delete));
swipeRefreshLayout.setOnRefreshListener(this::onRefresh); swipeRefreshLayout.setOnRefreshListener(this::onRefresh);
drawer.addDrawerListener( drawer.addDrawerListener(
@@ -167,7 +168,7 @@ public class MessagesActivity extends AppCompatActivity
item.setCheckable(true); item.setCheckable(true);
Target t = Utils.toDrawable(getResources(), item::setIcon); Target t = Utils.toDrawable(getResources(), item::setIcon);
targetReferences.add(t); targetReferences.add(t);
picasso.load(app.getImage()) picasso.load(Utils.resolveAbsoluteUrl(settings.url() + "/", app.getImage()))
.error(R.drawable.ic_alarm) .error(R.drawable.ic_alarm)
.placeholder(R.drawable.ic_placeholder) .placeholder(R.drawable.ic_placeholder)
.resize(100, 100) .resize(100, 100)