mirror of
https://github.com/gabehf/tempus.git
synced 2026-03-07 21:48:17 -08:00
188 lines
6 KiB
Java
188 lines
6 KiB
Java
package com.cappielloantonio.tempo.util;
|
|
|
|
import android.content.ClipData;
|
|
import android.content.ClipboardManager;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.net.Uri;
|
|
import android.text.TextUtils;
|
|
import android.view.View;
|
|
import android.widget.TextView;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.StringRes;
|
|
import androidx.core.content.ContextCompat;
|
|
|
|
import com.cappielloantonio.tempo.R;
|
|
|
|
import java.util.Objects;
|
|
|
|
import com.google.android.material.color.MaterialColors;
|
|
|
|
public final class AssetLinkUtil {
|
|
public static final String SCHEME = "tempo";
|
|
public static final String HOST_ASSET = "asset";
|
|
|
|
public static final String TYPE_SONG = "song";
|
|
public static final String TYPE_ALBUM = "album";
|
|
public static final String TYPE_ARTIST = "artist";
|
|
public static final String TYPE_PLAYLIST = "playlist";
|
|
public static final String TYPE_GENRE = "genre";
|
|
public static final String TYPE_YEAR = "year";
|
|
|
|
private AssetLinkUtil() {
|
|
}
|
|
|
|
@Nullable
|
|
public static AssetLink parse(@Nullable Intent intent) {
|
|
if (intent == null) return null;
|
|
return parse(intent.getData());
|
|
}
|
|
|
|
@Nullable
|
|
public static AssetLink parse(@Nullable Uri uri) {
|
|
if (uri == null) {
|
|
return null;
|
|
}
|
|
|
|
if (!SCHEME.equalsIgnoreCase(uri.getScheme())) {
|
|
return null;
|
|
}
|
|
|
|
String host = uri.getHost();
|
|
if (!HOST_ASSET.equalsIgnoreCase(host)) {
|
|
return null;
|
|
}
|
|
|
|
if (uri.getPathSegments().size() < 2) {
|
|
return null;
|
|
}
|
|
|
|
String type = uri.getPathSegments().get(0);
|
|
String id = uri.getPathSegments().get(1);
|
|
if (TextUtils.isEmpty(type) || TextUtils.isEmpty(id)) {
|
|
return null;
|
|
}
|
|
|
|
if (!isSupportedType(type)) {
|
|
return null;
|
|
}
|
|
|
|
return new AssetLink(type, id, uri);
|
|
}
|
|
|
|
public static boolean isSupportedType(@Nullable String type) {
|
|
if (type == null) return false;
|
|
switch (type) {
|
|
case TYPE_SONG:
|
|
case TYPE_ALBUM:
|
|
case TYPE_ARTIST:
|
|
case TYPE_PLAYLIST:
|
|
case TYPE_GENRE:
|
|
case TYPE_YEAR:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@NonNull
|
|
public static Uri buildUri(@NonNull String type, @NonNull String id) {
|
|
return new Uri.Builder()
|
|
.scheme(SCHEME)
|
|
.authority(HOST_ASSET)
|
|
.appendPath(type)
|
|
.appendPath(id)
|
|
.build();
|
|
}
|
|
|
|
@Nullable
|
|
public static String buildLink(@Nullable String type, @Nullable String id) {
|
|
if (TextUtils.isEmpty(type) || TextUtils.isEmpty(id) || !isSupportedType(type)) {
|
|
return null;
|
|
}
|
|
return buildUri(Objects.requireNonNull(type), Objects.requireNonNull(id)).toString();
|
|
}
|
|
|
|
@Nullable
|
|
public static AssetLink buildAssetLink(@Nullable String type, @Nullable String id) {
|
|
String link = buildLink(type, id);
|
|
return parseLinkString(link);
|
|
}
|
|
|
|
@Nullable
|
|
public static AssetLink parseLinkString(@Nullable String link) {
|
|
if (TextUtils.isEmpty(link)) {
|
|
return null;
|
|
}
|
|
return parse(Uri.parse(link));
|
|
}
|
|
|
|
public static void copyToClipboard(@NonNull Context context, @NonNull AssetLink assetLink) {
|
|
ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
if (clipboardManager == null) {
|
|
return;
|
|
}
|
|
ClipData clipData = ClipData.newPlainText(context.getString(R.string.asset_link_clipboard_label), assetLink.uri.toString());
|
|
clipboardManager.setPrimaryClip(clipData);
|
|
}
|
|
|
|
@StringRes
|
|
public static int getLabelRes(@NonNull String type) {
|
|
switch (type) {
|
|
case TYPE_SONG:
|
|
return R.string.asset_link_label_song;
|
|
case TYPE_ALBUM:
|
|
return R.string.asset_link_label_album;
|
|
case TYPE_ARTIST:
|
|
return R.string.asset_link_label_artist;
|
|
case TYPE_PLAYLIST:
|
|
return R.string.asset_link_label_playlist;
|
|
case TYPE_GENRE:
|
|
return R.string.asset_link_label_genre;
|
|
case TYPE_YEAR:
|
|
return R.string.asset_link_label_year;
|
|
default:
|
|
return R.string.asset_link_label_unknown;
|
|
}
|
|
}
|
|
|
|
public static void applyLinkAppearance(@NonNull View view) {
|
|
if (view instanceof TextView) {
|
|
TextView textView = (TextView) view;
|
|
if (textView.getTag(R.id.tag_link_original_color) == null) {
|
|
textView.setTag(R.id.tag_link_original_color, textView.getCurrentTextColor());
|
|
}
|
|
int accent = MaterialColors.getColor(view, com.google.android.material.R.attr.colorPrimary,
|
|
ContextCompat.getColor(view.getContext(), android.R.color.holo_blue_light));
|
|
textView.setTextColor(accent);
|
|
}
|
|
}
|
|
|
|
public static void clearLinkAppearance(@NonNull View view) {
|
|
if (view instanceof TextView) {
|
|
TextView textView = (TextView) view;
|
|
Object original = textView.getTag(R.id.tag_link_original_color);
|
|
if (original instanceof Integer) {
|
|
textView.setTextColor((Integer) original);
|
|
} else {
|
|
int defaultColor = MaterialColors.getColor(view, com.google.android.material.R.attr.colorOnSurface,
|
|
ContextCompat.getColor(view.getContext(), android.R.color.primary_text_light));
|
|
textView.setTextColor(defaultColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static final class AssetLink {
|
|
public final String type;
|
|
public final String id;
|
|
public final Uri uri;
|
|
|
|
AssetLink(@NonNull String type, @NonNull String id, @NonNull Uri uri) {
|
|
this.type = type;
|
|
this.id = id;
|
|
this.uri = uri;
|
|
}
|
|
}
|
|
}
|