This repository has been archived by the owner on Jun 2, 2022. It is now read-only.
forked from Mishiranu/Dashchan
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added whole thread's playlist playing in the exoplayer (exoplayer sup…
…ports navigation between videos now). Added touch gestures in the exoplayer (left and right swipes for navigation and up swipe to close the player). Fixed appearing of the second app icon.
- Loading branch information
Showing
7 changed files
with
318 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
125 changes: 125 additions & 0 deletions
125
player-lib/src/main/java/com/mishiranu/exoplayer/OnSwipeListener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
package com.mishiranu.exoplayer; | ||
|
||
import android.view.GestureDetector; | ||
import android.view.MotionEvent; | ||
|
||
/** | ||
* Gestures listener. | ||
* | ||
* @link https://stackoverflow.com/a/26387629/10452175 | ||
*/ | ||
public class OnSwipeListener extends GestureDetector.SimpleOnGestureListener { | ||
@Override | ||
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { | ||
|
||
// Grab two events located on the plane at e1=(x1, y1) and e2=(x2, y2) | ||
// Let e1 be the initial event | ||
// e2 can be located at 4 different positions, consider the following diagram | ||
// (Assume that lines are separated by 90 degrees.) | ||
// | ||
// | ||
// \ A / | ||
// \ / | ||
// D e1 B | ||
// / \ | ||
// / C \ | ||
// | ||
// So if (x2,y2) falls in region: | ||
// A => it's an UP swipe | ||
// B => it's a RIGHT swipe | ||
// C => it's a DOWN swipe | ||
// D => it's a LEFT swipe | ||
// | ||
|
||
float x1 = e1.getX(); | ||
float y1 = e1.getY(); | ||
|
||
float x2 = e2.getX(); | ||
float y2 = e2.getY(); | ||
|
||
Direction direction = getDirection(x1, y1, x2, y2); | ||
return onSwipe(direction); | ||
} | ||
|
||
/** | ||
* Override this method. The Direction enum will tell you how the user swiped. | ||
*/ | ||
public boolean onSwipe(Direction direction) { | ||
return false; | ||
} | ||
|
||
/** | ||
* Given two points in the plane p1=(x1, x2) and p2=(y1, y1), this method | ||
* returns the direction that an arrow pointing from p1 to p2 would have. | ||
* | ||
* @param x1 the x position of the first point | ||
* @param y1 the y position of the first point | ||
* @param x2 the x position of the second point | ||
* @param y2 the y position of the second point | ||
* @return the direction | ||
*/ | ||
public Direction getDirection(float x1, float y1, float x2, float y2) { | ||
double angle = getAngle(x1, y1, x2, y2); | ||
return Direction.fromAngle(angle); | ||
} | ||
|
||
/** | ||
* Finds the angle between two points in the plane (x1,y1) and (x2, y2) | ||
* The angle is measured with 0/360 being the X-axis to the right, angles | ||
* increase counter clockwise. | ||
* | ||
* @param x1 the x position of the first point | ||
* @param y1 the y position of the first point | ||
* @param x2 the x position of the second point | ||
* @param y2 the y position of the second point | ||
* @return the angle between two points | ||
*/ | ||
public double getAngle(float x1, float y1, float x2, float y2) { | ||
|
||
double rad = Math.atan2(y1 - y2, x2 - x1) + Math.PI; | ||
return (rad * 180 / Math.PI + 180) % 360; | ||
} | ||
|
||
|
||
public enum Direction { | ||
up, | ||
down, | ||
left, | ||
right; | ||
|
||
/** | ||
* Returns a direction given an angle. | ||
* Directions are defined as follows: | ||
* <p> | ||
* Up: [45, 135] | ||
* Right: [0,45] and [315, 360] | ||
* Down: [225, 315] | ||
* Left: [135, 225] | ||
* | ||
* @param angle an angle from 0 to 360 - e | ||
* @return the direction of an angle | ||
*/ | ||
public static Direction fromAngle(double angle) { | ||
if (inRange(angle, 45, 135)) { | ||
return Direction.up; | ||
} else if (inRange(angle, 0, 45) || inRange(angle, 315, 360)) { | ||
return Direction.right; | ||
} else if (inRange(angle, 225, 315)) { | ||
return Direction.down; | ||
} else { | ||
return Direction.left; | ||
} | ||
|
||
} | ||
|
||
/** | ||
* @param angle an angle | ||
* @param init the initial bound | ||
* @param end the final bound | ||
* @return returns true if the given angle is in the interval [init, end). | ||
*/ | ||
private static boolean inRange(double angle, float init, float end) { | ||
return (angle >= init) && (angle < end); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
player-lib/src/main/java/com/mishiranu/exoplayer/Playlist.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package com.mishiranu.exoplayer; | ||
|
||
import android.net.Uri; | ||
import android.os.Parcel; | ||
import android.os.Parcelable; | ||
|
||
import java.util.ArrayList; | ||
|
||
/** | ||
* Simple playlist class for the player. | ||
*/ | ||
public class Playlist implements Parcelable { | ||
protected ArrayList<Uri> URIs; | ||
protected int currentPosition; | ||
|
||
public Playlist(ArrayList<Uri> URIs, int currentPosition) { | ||
this.URIs = URIs; | ||
this.currentPosition = currentPosition; | ||
} | ||
|
||
public ArrayList<Uri> getURIs() { | ||
return URIs; | ||
} | ||
|
||
public int getCurrentPosition() { | ||
return currentPosition; | ||
} | ||
|
||
@Override | ||
public int describeContents() { | ||
return 0; | ||
} | ||
|
||
@Override | ||
public void writeToParcel(Parcel dest, int flags) { | ||
dest.writeList(URIs); | ||
dest.writeInt(currentPosition); | ||
} | ||
|
||
// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods | ||
public static final Parcelable.Creator<Playlist> CREATOR = new Parcelable.Creator<Playlist>() { | ||
@SuppressWarnings("unchecked") | ||
public Playlist createFromParcel(Parcel in) { | ||
return new Playlist(in.readArrayList(getClass().getClassLoader()), in.readInt()); | ||
} | ||
|
||
public Playlist[] newArray(int size) { | ||
return new Playlist[size]; | ||
} | ||
}; | ||
} |
Oops, something went wrong.