Added Share instagram stories

This commit is contained in:
h4h13 2020-02-02 18:14:16 +05:30
parent 5d640b59d1
commit 8e387264d5
16 changed files with 320 additions and 228 deletions

View file

@ -119,7 +119,7 @@
<activity android:name=".activities.PurchaseActivity" /> <activity android:name=".activities.PurchaseActivity" />
<activity android:name=".activities.WhatsNewActivity" /> <activity android:name=".activities.WhatsNewActivity" />
<activity android:name=".activities.bugreport.BugReportActivity" /> <activity android:name=".activities.bugreport.BugReportActivity" />
<activity android:name=".activities.ShareInstagramStory" />
<activity <activity
android:name=".activities.SearchActivity" android:name=".activities.SearchActivity"
android:windowSoftInputMode="stateVisible" /> android:windowSoftInputMode="stateVisible" />

View file

@ -0,0 +1,87 @@
/*
* Copyright (c) 2020 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.activities
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore.Images.Media
import androidx.core.view.drawToBitmap
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.Share
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_share_instagram.image
import kotlinx.android.synthetic.main.activity_share_instagram.mainContent
import kotlinx.android.synthetic.main.activity_share_instagram.shareButton
import kotlinx.android.synthetic.main.activity_share_instagram.shareText
import kotlinx.android.synthetic.main.activity_share_instagram.shareTitle
import kotlinx.android.synthetic.main.activity_share_instagram.toolbar
/**
* Created by hemanths on 2020-02-02.
*/
class ShareInstagramStory : AbsBaseActivity() {
companion object {
const val EXTRA_SONG = "extra_song"
}
override fun onCreate(savedInstanceState: Bundle?) {
setDrawUnderStatusBar()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_share_instagram)
setStatusbarColorAuto()
setNavigationbarColorAuto()
setLightNavigationBar(true)
val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface)
toolbar.setBackgroundColor(toolbarColor)
ToolbarContentTintHelper.colorBackButton(toolbar)
setSupportActionBar(toolbar)
val song = intent.extras?.getParcelable<Song>(EXTRA_SONG)
song?.let { songFinal ->
SongGlideRequest.Builder.from(Glide.with(this), songFinal)
.asBitmap()
.build()
.into(image)
shareTitle.text = songFinal.title
shareText.text = songFinal.artistName
shareButton.setOnClickListener {
val path: String = Media.insertImage(
contentResolver,
mainContent.drawToBitmap(Bitmap.Config.ARGB_8888),
"Design", null
)
val uri = Uri.parse(path)
Share.shareFileToInstagram(
this@ShareInstagramStory,
songFinal,
uri
)
}
}
shareButton.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this))
}
}

View file

@ -306,6 +306,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlay
} else if (currentNowPlayingScreen == FULL || currentNowPlayingScreen == CARD || currentNowPlayingScreen == FIT || currentNowPlayingScreen == BLUR || currentNowPlayingScreen == BLUR_CARD) { } else if (currentNowPlayingScreen == FULL || currentNowPlayingScreen == CARD || currentNowPlayingScreen == FIT || currentNowPlayingScreen == BLUR || currentNowPlayingScreen == BLUR_CARD) {
super.setLightStatusbar(false) super.setLightStatusbar(false)
super.setLightNavigationBar(true) super.setLightNavigationBar(true)
super.setNavigationbarColor(Color.BLACK)
} else if (currentNowPlayingScreen == COLOR || currentNowPlayingScreen == TINY) { } else if (currentNowPlayingScreen == COLOR || currentNowPlayingScreen == TINY) {
super.setNavigationbarColor(paletteColor) super.setNavigationbarColor(paletteColor)
super.setLightNavigationBar(isColorLight) super.setLightNavigationBar(isColorLight)

View file

@ -19,6 +19,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.ShareInstagramStory
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
@ -29,7 +30,7 @@ import com.afollestad.materialdialogs.list.listItems
class SongShareDialog : DialogFragment() { class SongShareDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val song: Song? = arguments!!.getParcelable("song") val song: Song? = arguments?.getParcelable("song")
val currentlyListening: String = val currentlyListening: String =
getString(R.string.currently_listening_to_x_by_x, song?.title, song?.artistName) getString(R.string.currently_listening_to_x_by_x, song?.title, song?.artistName)
@ -40,7 +41,8 @@ class SongShareDialog : DialogFragment() {
listItems( listItems(
items = listOf( items = listOf(
getString(code.name.monkey.retromusic.R.string.the_audio_file), getString(code.name.monkey.retromusic.R.string.the_audio_file),
"\u201C" + currentlyListening + "\u201D" "\u201C" + currentlyListening + "\u201D",
getString(R.string.social_instagram)
) )
) { _, index, _ -> ) { _, index, _ ->
when (index) { when (index) {
@ -53,7 +55,7 @@ class SongShareDialog : DialogFragment() {
}, null)) }, null))
} }
1 -> { 1 -> {
activity!!.startActivity( startActivity(
Intent.createChooser( Intent.createChooser(
Intent() Intent()
.setAction(Intent.ACTION_SEND) .setAction(Intent.ACTION_SEND)
@ -63,6 +65,16 @@ class SongShareDialog : DialogFragment() {
) )
) )
} }
2 -> {
if (song != null) {
startActivity(
Intent(requireContext(), ShareInstagramStory::class.java).putExtra(
ShareInstagramStory.EXTRA_SONG,
song
)
)
}
}
} }
} }
} }

View file

@ -76,15 +76,15 @@ abstract class AbsPlayerFragment : AbsMusicServiceFragment(),
return true return true
} }
R.id.action_share -> { R.id.action_share -> {
SongShareDialog.create(song).show(requireFragmentManager(), "SHARE_SONG") SongShareDialog.create(song).show(childFragmentManager, "SHARE_SONG")
return true return true
} }
R.id.action_delete_from_device -> { R.id.action_delete_from_device -> {
DeleteSongsDialog.create(song).show(requireFragmentManager(), "DELETE_SONGS") DeleteSongsDialog.create(song).show(childFragmentManager, "DELETE_SONGS")
return true return true
} }
R.id.action_add_to_playlist -> { R.id.action_add_to_playlist -> {
AddToPlaylistDialog.create(song).show(requireFragmentManager(), "ADD_PLAYLIST") AddToPlaylistDialog.create(song).show(childFragmentManager, "ADD_PLAYLIST")
return true return true
} }
R.id.action_clear_playing_queue -> { R.id.action_clear_playing_queue -> {
@ -93,7 +93,7 @@ abstract class AbsPlayerFragment : AbsMusicServiceFragment(),
} }
R.id.action_save_playing_queue -> { R.id.action_save_playing_queue -> {
CreatePlaylistDialog.create(MusicPlayerRemote.playingQueue) CreatePlaylistDialog.create(MusicPlayerRemote.playingQueue)
.show(requireFragmentManager(), "ADD_TO_PLAYLIST") .show(childFragmentManager, "ADD_TO_PLAYLIST")
return true return true
} }
R.id.action_tag_editor -> { R.id.action_tag_editor -> {
@ -103,7 +103,7 @@ abstract class AbsPlayerFragment : AbsMusicServiceFragment(),
return true return true
} }
R.id.action_details -> { R.id.action_details -> {
SongDetailDialog.create(song).show(requireFragmentManager(), "SONG_DETAIL") SongDetailDialog.create(song).show(childFragmentManager, "SONG_DETAIL")
return true return true
} }
R.id.action_go_to_album -> { R.id.action_go_to_album -> {

View file

@ -396,18 +396,27 @@ public class MusicService extends Service implements
mediaStoreObserver = new MediaStoreObserver(this, playerHandler); mediaStoreObserver = new MediaStoreObserver(this, playerHandler);
throttledSeekHandler = new ThrottledSeekHandler(this, playerHandler); throttledSeekHandler = new ThrottledSeekHandler(this, playerHandler);
getContentResolver().registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); getContentResolver()
getContentResolver().registerContentObserver(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); .registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver().registerContentObserver(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); getContentResolver()
getContentResolver().registerContentObserver(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); .registerContentObserver(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver().registerContentObserver(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver); getContentResolver()
.registerContentObserver(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver().registerContentObserver(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver); getContentResolver()
getContentResolver().registerContentObserver(MediaStore.Audio.Albums.INTERNAL_CONTENT_URI, true, mediaStoreObserver); .registerContentObserver(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver().registerContentObserver(MediaStore.Audio.Artists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); getContentResolver()
getContentResolver().registerContentObserver(MediaStore.Audio.Genres.INTERNAL_CONTENT_URI, true, mediaStoreObserver); .registerContentObserver(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver().registerContentObserver(MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver()
.registerContentObserver(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver()
.registerContentObserver(MediaStore.Audio.Albums.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver()
.registerContentObserver(MediaStore.Audio.Artists.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver()
.registerContentObserver(MediaStore.Audio.Genres.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
getContentResolver()
.registerContentObserver(MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this); PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this);

View file

@ -1,101 +0,0 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.util
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Environment
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
/**
* Created by hemanths on 2019-11-05.
*/
class ImageSaver(val context: Context) {
private var external: Boolean = false
private var directoryName: String = "RetroMusic"
private var fileName: String = "profile.png"
fun setFileName(fileName: String): ImageSaver {
this.fileName = fileName
return this
}
fun setDirectoryName(directoryName: String): ImageSaver {
this.directoryName = directoryName
return this
}
fun setStoreType(external: Boolean): ImageSaver {
this.external = external
return this
}
fun save(bitmap: Bitmap) {
var fileOutputStream: FileOutputStream? = null
try {
fileOutputStream = FileOutputStream(createFile())
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)
} catch (er: Exception) {
println(er)
} finally {
try {
fileOutputStream?.close()
} catch (er: IOException) {
println(er)
}
}
}
fun getFile(): File {
return createFile()
}
private fun createFile(): File {
val directory: File = if (external) {
getFileStorePlace(directoryName)
} else {
context.getDir(directoryName, Context.MODE_PRIVATE)
}
if (!directory.exists() && !directory.mkdirs()) {
println("Error in creating folders $directory")
}
println("Create file -> $directory/$fileName")
return File(directory, fileName)
}
private fun getFileStorePlace(directoryName: String): File {
return File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), directoryName)
}
fun load(): Bitmap? {
var inputStream: FileInputStream? = null
return try {
inputStream = FileInputStream(createFile())
BitmapFactory.decodeStream(inputStream)
} catch (er: Exception) {
try {
inputStream?.close()
} catch (e: IOException) {
e.printStackTrace()
}
null
}
}
}

View file

@ -1,84 +0,0 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.util;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import code.name.monkey.retromusic.rest.model.LastFmAlbum.Album.Image;
import code.name.monkey.retromusic.rest.model.LastFmArtist;
public class LastFMUtil {
public static String getLargestAlbumImageUrl(List<Image> list) {
Map hashMap = new HashMap();
for (Image image : list) {
Object obj = null;
String size = image.getSize();
if (size == null) {
obj = ImageSize.UNKNOWN;
} else {
try {
obj = ImageSize.valueOf(size.toUpperCase(Locale.ENGLISH));
} catch (IllegalArgumentException ignored) {
}
}
if (obj != null) {
hashMap.put(obj, image.getText());
}
}
return getLargestImageUrl(hashMap);
}
public static String getLargestArtistImageUrl(List<LastFmArtist.Artist.Image> list) {
Map hashMap = new HashMap();
for (LastFmArtist.Artist.Image image : list) {
Object obj = null;
String size = image.getSize();
if (size == null) {
obj = ImageSize.UNKNOWN;
} else {
try {
obj = ImageSize.valueOf(size.toUpperCase(Locale.ENGLISH));
} catch (IllegalArgumentException ignored) {
}
}
if (obj != null) {
hashMap.put(obj, image.getText());
}
}
return getLargestImageUrl(hashMap);
}
private static String getLargestImageUrl(Map<ImageSize, String> map) {
return map.containsKey(ImageSize.MEGA) ? map.get(ImageSize.MEGA)
: map.containsKey(ImageSize.EXTRALARGE) ? map.get(ImageSize.EXTRALARGE)
: map.containsKey(ImageSize.LARGE) ? map.get(ImageSize.LARGE)
: map.containsKey(ImageSize.MEDIUM) ? map.get(ImageSize.MEDIUM)
: map.containsKey(ImageSize.SMALL) ? map.get(ImageSize.SMALL)
: map.containsKey(ImageSize.UNKNOWN) ? map.get(ImageSize.UNKNOWN) : null;
}
private enum ImageSize {
SMALL,
MEDIUM,
LARGE,
EXTRALARGE,
MEGA,
UNKNOWN
}
}

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2020 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.util
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.app.ActivityCompat
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Song
/**
* Created by hemanths on 2020-02-02.
*/
object Share {
private const val INSTAGRAM_PACKAGE_NAME = "com.instagram.android"
fun shareFileToInstagram(context: Context, song: Song, uri: Uri) {
val feedIntent = Intent(Intent.ACTION_SEND)
feedIntent.type = "image/*"
feedIntent.putExtra(Intent.EXTRA_TITLE, song.title)
feedIntent.putExtra(Intent.EXTRA_TEXT, song.artistName)
feedIntent.putExtra(Intent.EXTRA_STREAM, uri)
feedIntent.setPackage(INSTAGRAM_PACKAGE_NAME)
val storiesIntent = Intent("com.instagram.share.ADD_TO_STORY")
storiesIntent.setDataAndType(uri, "jpg")
storiesIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
storiesIntent.setPackage(INSTAGRAM_PACKAGE_NAME)
storiesIntent.putExtra(Intent.EXTRA_TITLE, song.title)
storiesIntent.putExtra(Intent.EXTRA_TEXT, song.artistName)
context.grantUriPermission("com.instagram.android", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
val chooserIntent = Intent.createChooser(feedIntent, context.getString(R.string.social_instagram))
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(storiesIntent))
ActivityCompat.startActivity(context, chooserIntent, null)
}
}

View file

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android">
>
<gradient <gradient
android:angle="90" android:angle="90"
android:endColor="@android:color/transparent" android:endColor="@android:color/transparent"
android:startColor="#000000"/> android:startColor="@color/md_black_1000" />
</shape> </shape>

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) 2020 Hemanth Savarala.
~
~ Licensed under the GNU General Public License v3
~
~ This is free software: you can redistribute it and/or modify it under
~ the terms of the GNU General Public License as published by
~ the Free Software Foundation either version 3 of the License, or (at your option) any later version.
~
~ This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
~ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
~ See the GNU General Public License for more details.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<code.name.monkey.retromusic.views.StatusBarView
android:id="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="?attr/colorSurface"
tools:ignore="UnusedAttribute" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/social_instagram" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<code.name.monkey.retromusic.views.WidthFitSquareCardView
android:id="@+id/imageContainerCard"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_margin="24dp"
app:cardCornerRadius="8dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:src="@tools:sample/avatars" />
</code.name.monkey.retromusic.views.WidthFitSquareCardView>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/shareTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:textAppearance="@style/TextViewHeadline5"
android:textColor="@color/md_white_1000"
android:textStyle="bold"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/imageContainerCard"
tools:text="@tools:sample/full_names" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/shareText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textAppearance="@style/TextViewHeadline6"
android:textColor="@color/md_white_1000"
android:textStyle="bold"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/shareTitle"
tools:text="@tools:sample/full_names" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/shareButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_margin="16dp"
android:text="Instagram Stories"
app:layout_constraintBottom_toBottomOf="@+id/appCompatImageView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/mainContent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>

View file

@ -22,7 +22,7 @@
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#C0000000" /> android:background="@drawable/shadow_up_full_theme" />
<LinearLayout <LinearLayout
@ -39,7 +39,6 @@
android:layout_gravity="bottom" android:layout_gravity="bottom"
tools:layout="@layout/fragment_full_player_controls" /> tools:layout="@layout/fragment_full_player_controls" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -94,6 +93,7 @@
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextViewSubtitle1" android:textAppearance="@style/TextViewSubtitle1"
android:textColor="@color/md_white_1000" android:textColor="@color/md_white_1000"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/artistImage" app:layout_constraintEnd_toStartOf="@+id/artistImage"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -128,7 +128,7 @@
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible">
<TextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/player_lyrics_line1" android:id="@+id/player_lyrics_line1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -136,11 +136,11 @@
android:shadowColor="@color/md_black_1000" android:shadowColor="@color/md_black_1000"
android:shadowRadius="4" android:shadowRadius="4"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@style/TextViewHeadline6"
android:textColor="@color/md_white_1000" android:textColor="@color/md_white_1000"
android:textSize="22sp"
android:visibility="gone" /> android:visibility="gone" />
<TextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/player_lyrics_line2" android:id="@+id/player_lyrics_line2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -148,10 +148,9 @@
android:shadowColor="@color/md_black_1000" android:shadowColor="@color/md_black_1000"
android:shadowRadius="4" android:shadowRadius="4"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/md_white_1000" android:textAppearance="@style/TextViewHeadline6"
android:textSize="22sp" /> android:textColor="@color/md_white_1000" />
</FrameLayout> </FrameLayout>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View file

@ -14,6 +14,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/roundSelector" android:background="?attr/roundSelector"
android:padding="12dp" android:padding="12dp"
app:layout_constraintBottom_toBottomOf="@+id/text"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_more_vert_white_24dp" /> app:srcCompat="@drawable/ic_more_vert_white_24dp" />
@ -45,9 +46,7 @@
android:ellipsize="end" android:ellipsize="end"
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="1"
android:paddingStart="8dp" android:padding="8dp"
android:paddingTop="12dp"
android:paddingEnd="8dp"
android:textColor="@color/md_white_1000" android:textColor="@color/md_white_1000"
app:layout_constraintBottom_toTopOf="@+id/progressSlider" app:layout_constraintBottom_toTopOf="@+id/progressSlider"
app:layout_constraintEnd_toStartOf="@+id/playerMenu" app:layout_constraintEnd_toStartOf="@+id/playerMenu"
@ -62,9 +61,9 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/roundSelector" android:background="?attr/roundSelector"
android:padding="12dp" android:padding="12dp"
app:layout_constraintBottom_toBottomOf="@+id/text"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="@+id/title"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/ic_favorite_border_white_24dp" /> app:srcCompat="@drawable/ic_favorite_border_white_24dp" />

View file

@ -25,5 +25,5 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignTop="@id/dummy_statusbar_actionbar" android:layout_alignTop="@id/dummy_statusbar_actionbar"
android:layout_alignBottom="@id/dummy_statusbar_actionbar" android:layout_alignBottom="@id/dummy_statusbar_actionbar"
android:background="@drawable/shadow_down" /> android:background="@drawable/shadow_down_strong" />
</RelativeLayout> </RelativeLayout>

View file

@ -460,7 +460,7 @@
<string name="pick_image_intent_text">Pick image</string> <string name="pick_image_intent_text">Pick image</string>
<string name="pinterest_page">Pinterest</string> <string name="pinterest_page">Pinterest</string>
<string name="pinterest_page_summary">Follow Pintrest page for Retro Music design inspiration</string> <string name="pinterest_page_summary">Follow Pinterest page for Retro Music design inspiration</string>
<string name="plain">Plain</string> <string name="plain">Plain</string>
@ -821,4 +821,5 @@
<string name="volume">Volume</string> <string name="volume">Volume</string>
<string name="listeners_label">Listeners</string> <string name="listeners_label">Listeners</string>
<string name="scrobbles_label">Scrobbles</string> <string name="scrobbles_label">Scrobbles</string>
<string name="social_instagram">Instagram story</string>
</resources> </resources>

View file

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <paths>
<external-path name="external_files" path="."/> <external-path
name="external_files"
path="." />
</paths> </paths>