From 6fa8ab64e73a6df91a4b8746c1db0ea623e08699 Mon Sep 17 00:00:00 2001 From: azisnaufal Date: Mon, 4 Dec 2017 17:17:04 +0700 Subject: [PATCH 1/2] Redesign new splash screen --- kute-android-app/.idea/misc.xml | 15 +---- kute-android-app/app/build.gradle | 3 + .../scorelab/kute/kute/SplashActivity.java | 27 ++++++++- .../app/src/main/res/drawable/score.jpg | Bin 0 -> 28985 bytes .../src/main/res/layout/activity_splash.xml | 53 +++++++++++++----- .../app/src/main/res/values/dimens.xml | 3 + 6 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 kute-android-app/app/src/main/res/drawable/score.jpg diff --git a/kute-android-app/.idea/misc.xml b/kute-android-app/.idea/misc.xml index 7158618b..ad535163 100644 --- a/kute-android-app/.idea/misc.xml +++ b/kute-android-app/.idea/misc.xml @@ -1,8 +1,5 @@ - - - - - - - - - - - - - - + diff --git a/kute-android-app/app/build.gradle b/kute-android-app/app/build.gradle index be480862..5fdc7580 100644 --- a/kute-android-app/app/build.gradle +++ b/kute-android-app/app/build.gradle @@ -33,6 +33,7 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) + def htextview_version = "0.1.2" @@ -47,6 +48,8 @@ dependencies { compile 'com.facebook.android:facebook-android-sdk:4.25.0' compile 'com.android.volley:volley:1.0.0' compile 'com.android.support:appcompat-v7:25.1.1' + compile "com.hanks:htextview-base:$htextview_version" // base library + compile "com.hanks:htextview-typer:$htextview_version" // optional compile 'com.android.support:design:25.1.1' compile 'de.hdodenhof:circleimageview:2.1.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' diff --git a/kute-android-app/app/src/main/java/com/scorelab/kute/kute/SplashActivity.java b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/SplashActivity.java index 3349d730..9a7524f5 100644 --- a/kute-android-app/app/src/main/java/com/scorelab/kute/kute/SplashActivity.java +++ b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/SplashActivity.java @@ -5,20 +5,43 @@ import android.content.SharedPreferences; import android.graphics.Bitmap; import android.os.AsyncTask; +import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.view.View; import com.google.firebase.database.FirebaseDatabase; +import com.hanks.htextview.typer.TyperTextView; import com.scorelab.kute.kute.Activity.RegisterActivity; import com.scorelab.kute.kute.Activity.SwitchPrivatePublicActivity; import com.scorelab.kute.kute.Util.ImageHandler; public class SplashActivity extends AppCompatActivity { static FirebaseDatabase fb; + TyperTextView ttv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); + ttv = (TyperTextView) findViewById(R.id.ttv); + ttv.setSoundEffectsEnabled(false); + ttv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ((TyperTextView)v).animateText("A Commute App for Sri Lanka"); + } + }); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ttv.performClick(); + } + },2500); + + + + new DelayTask().execute(); // This will delay the spalsh scrren and redierct to the login/register screen based //on the ststus of the user. @@ -30,7 +53,7 @@ class DelayTask extends AsyncTask{ @Override protected Void doInBackground(Void... params) { try { - Thread.sleep(4000); + Thread.sleep(5000); } catch (Exception e){ @@ -49,10 +72,12 @@ protected void onPostExecute(Void aVoid) { Intent regIntent =new Intent(SplashActivity.this, RegisterActivity.class); startActivity(regIntent); + finish(); } else{ //User registered in the system. Intent switchIntent =new Intent(SplashActivity.this, SwitchPrivatePublicActivity.class); startActivity(switchIntent); + finish(); } diff --git a/kute-android-app/app/src/main/res/drawable/score.jpg b/kute-android-app/app/src/main/res/drawable/score.jpg new file mode 100644 index 0000000000000000000000000000000000000000..579ef296571b9451b6d9a6c16f05f4e43d58a83f GIT binary patch literal 28985 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 gtiwrms85~@xT~ literal 0 HcmV?d00001 diff --git a/kute-android-app/app/src/main/res/layout/activity_splash.xml b/kute-android-app/app/src/main/res/layout/activity_splash.xml index 9b3e849e..fdcb0038 100644 --- a/kute-android-app/app/src/main/res/layout/activity_splash.xml +++ b/kute-android-app/app/src/main/res/layout/activity_splash.xml @@ -4,24 +4,49 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_splash" android:layout_width="match_parent" + android:background="@android:color/white" tools:context="com.scorelab.kute.kute.SplashActivity" android:layout_height="match_parent"> - - + android:layout_alignParentBottom="true" + android:scaleType="fitCenter" + android:layout_marginTop="440dp" + android:layout_marginBottom="40dp" + android:src="@drawable/score" /> + + + + + + + + + diff --git a/kute-android-app/app/src/main/res/values/dimens.xml b/kute-android-app/app/src/main/res/values/dimens.xml index 3aaa0490..da6f0c46 100644 --- a/kute-android-app/app/src/main/res/values/dimens.xml +++ b/kute-android-app/app/src/main/res/values/dimens.xml @@ -17,4 +17,7 @@ 20dp 80dp 80dp + + 16dp + 16dp From 7bb0d027f43115b227aebeeda029a17db5a93120 Mon Sep 17 00:00:00 2001 From: azisnaufal Date: Sun, 10 Dec 2017 07:25:44 +0700 Subject: [PATCH 2/2] Redesign new Sign In UI --- kute-android-app/.idea/misc.xml | 2 +- kute-android-app/app/build.gradle | 1 + .../kute/kute/Activity/RegisterActivity.java | 95 +++- .../kute/kute/Library/TextureVideoView.java | 453 ++++++++++++++++++ .../app/src/main/res/drawable/fb_icon.xml | 13 + .../src/main/res/drawable/google_g_logo.xml | 35 ++ .../app/src/main/res/layout/testreg.xml | 137 ++++-- .../app/src/main/res/raw/videoview_kute.mp4 | Bin 0 -> 5242033 bytes 8 files changed, 698 insertions(+), 38 deletions(-) create mode 100644 kute-android-app/app/src/main/java/com/scorelab/kute/kute/Library/TextureVideoView.java create mode 100644 kute-android-app/app/src/main/res/drawable/fb_icon.xml create mode 100644 kute-android-app/app/src/main/res/drawable/google_g_logo.xml create mode 100644 kute-android-app/app/src/main/res/raw/videoview_kute.mp4 diff --git a/kute-android-app/.idea/misc.xml b/kute-android-app/.idea/misc.xml index ad535163..cc72de32 100644 --- a/kute-android-app/.idea/misc.xml +++ b/kute-android-app/.idea/misc.xml @@ -24,7 +24,7 @@ - + diff --git a/kute-android-app/app/build.gradle b/kute-android-app/app/build.gradle index 5fdc7580..d1278e45 100644 --- a/kute-android-app/app/build.gradle +++ b/kute-android-app/app/build.gradle @@ -50,6 +50,7 @@ dependencies { compile 'com.android.support:appcompat-v7:25.1.1' compile "com.hanks:htextview-base:$htextview_version" // base library compile "com.hanks:htextview-typer:$htextview_version" // optional + compile "com.hanks:htextview-line:$htextview_version" // optional compile 'com.android.support:design:25.1.1' compile 'de.hdodenhof:circleimageview:2.1.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' diff --git a/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Activity/RegisterActivity.java b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Activity/RegisterActivity.java index 1f474f7d..c567736a 100644 --- a/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Activity/RegisterActivity.java +++ b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Activity/RegisterActivity.java @@ -4,13 +4,16 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.os.AsyncTask; +import android.net.Uri; import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; @@ -42,10 +45,17 @@ import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; +import com.hanks.htextview.line.LineTextView; +import com.hanks.htextview.typer.TyperTextView; +import com.scorelab.kute.kute.Library.TextureVideoView; import com.scorelab.kute.kute.R; import com.scorelab.kute.kute.SplashActivity; import com.scorelab.kute.kute.Util.ImageHandler; +import java.io.IOException; + +import static java.lang.Thread.sleep; + public class RegisterActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener{ @@ -55,12 +65,16 @@ public class RegisterActivity extends AppCompatActivity implements private static final int RC_SIGN_IN = 9001; private SignInButton mSignInButton; + LoginButton loginButton; + TyperTextView lineTextView; + String animText = "Kute"; + CountDownTimer timer; private GoogleApiClient mGoogleApiClient; // Firebase instance variables private FirebaseAuth mFirebaseAuth; - + TextureVideoView videoview; // [START declare_auth] private FirebaseAuth mAuth; // [END declare_auth] @@ -68,15 +82,19 @@ public class RegisterActivity extends AppCompatActivity implements private FirebaseAuth.AuthStateListener mAuthListener; private CallbackManager mCallbackManager; //Facebook + Button inG, inFB; @Override public void onClick(View v) { switch (v.getId()) { - case R.id.login_with_google: + case R.id.btn_inG: signIn(); break; + case R.id.btn_inFB: + loginButton.performClick(); + break; } } @@ -150,7 +168,61 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { + setContentView(R.layout.testreg); + videoview = (TextureVideoView) findViewById(R.id.videoview); + Uri myUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.videoview_kute); + videoview.setDataSourceURI(this, myUri); + + videoview.setScaleType(TextureVideoView.ScaleType.CENTER_CROP); + videoview.setLooping(true); + videoview.play(); + lineTextView = (TyperTextView) findViewById(R.id.textView); + inG = (Button) findViewById(R.id.btn_inG); + inFB = (Button) findViewById(R.id.btn_inFB); + inG.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + signIn(); + } + }); + inFB.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + loginButton.performClick(); + } + }); + lineTextView.setSoundEffectsEnabled(false); + lineTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ((TyperTextView)v).animateText(animText); + if (animText.equals("A Commute App for Sri Lanka")){ + animText = "Kute"; + } + else if (animText.equals("Kute")){ + animText = "A Commute App for Sri Lanka"; + } + } + }); + + + timer = new CountDownTimer(5000, 3000) { + + @Override + public void onTick(long millisUntilFinished) { + lineTextView.performClick(); + } + + @Override + public void onFinish() { + try{ + yourMethod(); + }catch(Exception e){ + Log.e("Error", "Error: " + e.toString()); + } + } + }.start(); // Assign fields mSignInButton = (SignInButton) findViewById(R.id.login_with_google); @@ -171,7 +243,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { // Initialize FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance(); - //Facebook mAuth = FirebaseAuth.getInstance(); // [START auth_state_listener] @@ -205,7 +276,7 @@ public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { }; mCallbackManager = CallbackManager.Factory.create(); - LoginButton loginButton = (LoginButton) findViewById(R.id.connectWithFbButton); + loginButton = (LoginButton) findViewById(R.id.connectWithFbButton); loginButton.setReadPermissions("email", "public_profile","user_friends"); loginButton.registerCallback(mCallbackManager, new FacebookCallback() { @@ -285,19 +356,33 @@ public void onError(FacebookException error) { rq= Volley.newRequestQueue(this); } + void yourMethod(){ + timer.start(); + } @Override protected void onStop() { super.onStop(); + videoview.stop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } + @Override + protected void onDestroy() { + super.onDestroy(); + videoview.stop(); + if (mAuthListener != null) { + mAuth.removeAuthStateListener(mAuthListener); + } + } + @Override protected void onStart() { super.onStart(); + mAuth.addAuthStateListener(mAuthListener); } diff --git a/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Library/TextureVideoView.java b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Library/TextureVideoView.java new file mode 100644 index 00000000..34d10837 --- /dev/null +++ b/kute-android-app/app/src/main/java/com/scorelab/kute/kute/Library/TextureVideoView.java @@ -0,0 +1,453 @@ +package com.scorelab.kute.kute.Library; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.graphics.Matrix; +import android.graphics.SurfaceTexture; +import android.media.MediaPlayer; +import android.net.Uri; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.TextureView; +import android.widget.FrameLayout; + +import java.io.IOException; + +/* + * The MIT License (MIT) + * + * Copyright (c) 2014 Danylyk Dmytro + * Copyright (c) 2014 Jacob Tabak + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +public class TextureVideoView extends FrameLayout implements TextureView.SurfaceTextureListener { + + // Indicate if logging is on + public static final boolean LOG_ON = true; + + // Log tag + private static final String TAG = TextureVideoView.class.getName(); + + private MediaPlayer mMediaPlayer; + + private float mVideoHeight; + private float mVideoWidth; + + private boolean mIsDataSourceSet; + private boolean mIsViewAvailable; + private boolean mIsVideoPrepared; + private boolean mIsPlayCalled; + + private ScaleType mScaleType; + private State mState; + private TextureView mTextureView; + + public enum ScaleType { + CENTER_CROP, TOP, BOTTOM + } + + public enum State { + UNINITIALIZED, PLAY, STOP, PAUSE, END + } + + public TextureVideoView(Context context) { + super(context); + if (!isInEditMode()) { + initView(); + } + } + + public TextureVideoView(Context context, AttributeSet attrs) { + super(context, attrs); + if (!isInEditMode()) { + initView(); + } + } + + public TextureVideoView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + if (!isInEditMode()) { + initView(); + } + } + + private void initView() { + initPlayer(); + mTextureView = new TextureView(getContext()); + removeAllViews(); + addView(mTextureView); + setScaleType(ScaleType.CENTER_CROP); + mTextureView.setSurfaceTextureListener(this); + } + + public void setScaleType(ScaleType scaleType) { + mScaleType = scaleType; + } + + private void updateTextureViewSize() { + float viewWidth = getWidth(); + float viewHeight = getHeight(); + + float scaleX = 1.0f; + float scaleY = 1.0f; + + if (mVideoWidth >= viewWidth && mVideoHeight >= viewHeight) { + scaleX = mVideoWidth / viewWidth; + scaleY = mVideoHeight / viewHeight; + } else if (mVideoWidth <= viewWidth && mVideoHeight <= viewHeight) { + scaleY = viewWidth / mVideoWidth; + scaleX = viewHeight / mVideoHeight; + } else if (viewWidth >= mVideoWidth) { + scaleY = (viewWidth / mVideoWidth) / (viewHeight / mVideoHeight); + } else if (viewHeight >= mVideoHeight) { + scaleX = (viewHeight / mVideoHeight) / (viewWidth / mVideoWidth); + } + + // Calculate pivot points, in our case crop from center + int pivotPointX; + int pivotPointY; + + switch (mScaleType) { + case TOP: + pivotPointX = 0; + pivotPointY = 0; + break; + case BOTTOM: + pivotPointX = (int) (viewWidth); + pivotPointY = (int) (viewHeight); + break; + case CENTER_CROP: + pivotPointX = (int) (viewWidth / 2); + pivotPointY = (int) (viewHeight / 2); + break; + default: + pivotPointX = (int) (viewWidth / 2); + pivotPointY = (int) (viewHeight / 2); + break; + } + + Matrix matrix = new Matrix(); + matrix.setScale(scaleX, scaleY, pivotPointX, pivotPointY); + mTextureView.setTransform(matrix); + } + + private void initPlayer() { + if (mMediaPlayer == null) { + mMediaPlayer = new MediaPlayer(); + } else { + mMediaPlayer.reset(); + } + mIsVideoPrepared = false; + mIsPlayCalled = false; + mState = State.UNINITIALIZED; + } + + public boolean isPlaying() { + if (mMediaPlayer != null) { + return mMediaPlayer.isPlaying(); + } + return false; + } + /** + * @see android.media.MediaPlayer#setDataSource(String) + */ + public void setDataSourceURI(Context c, Uri u) { + initPlayer(); + + try { + mMediaPlayer.setDataSource(c,u); + mIsDataSourceSet = true; + prepare(); + } catch (IOException e) { + Log.d(TAG, e.getMessage()); + } + } + /** + * @see android.media.MediaPlayer#setDataSource(String) + */ + public void setDataSource(String path) { + initPlayer(); + + try { + mMediaPlayer.setDataSource(path); + mIsDataSourceSet = true; + prepare(); + } catch (IOException e) { + Log.d(TAG, e.getMessage()); + } + } + /** + * @see android.media.MediaPlayer#setDataSource(android.content.Context, android.net.Uri) + */ + public void setDataSource(Context context, Uri uri) { + initPlayer(); + + try { + mMediaPlayer.setDataSource(context, uri); + mIsDataSourceSet = true; + prepare(); + } catch (IOException e) { + Log.d(TAG, e.getMessage()); + } + } + + /** + * @see android.media.MediaPlayer#setDataSource(java.io.FileDescriptor) + */ + public void setDataSource(AssetFileDescriptor afd) { + initPlayer(); + + try { + long startOffset = afd.getStartOffset(); + long length = afd.getLength(); + mMediaPlayer.setDataSource(afd.getFileDescriptor(), startOffset, length); + mIsDataSourceSet = true; + prepare(); + } catch (IOException e) { + Log.d(TAG, e.getMessage()); + } + } + + private void prepare() { + try { + mMediaPlayer.setOnVideoSizeChangedListener( + new MediaPlayer.OnVideoSizeChangedListener() { + @Override + public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { + mVideoWidth = width; + mVideoHeight = height; + updateTextureViewSize(); + } + } + ); + mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + mState = State.END; + log("Video has ended."); + + if (mListener != null) { + mListener.onVideoEnd(); + } + } + }); + + mMediaPlayer.prepareAsync(); + + // Play video when the media source is ready for playback. + mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mediaPlayer) { + mIsVideoPrepared = true; + if (mIsPlayCalled && mIsViewAvailable) { + log("Player is prepared and play() was called."); + play(); + } + + if (mListener != null) { + mListener.onVideoPrepared(); + } + } + }); + + mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mediaPlayer, int i, int i2) { + return false; + } + }); + + } catch (IllegalArgumentException e) { + Log.d(TAG, e.getMessage()); + } catch (SecurityException e) { + Log.d(TAG, e.getMessage()); + } catch (IllegalStateException e) { + Log.d(TAG, e.toString()); + } + } + + /** + * Play or resume video. Video will be played as soon as view is available and media player is + * prepared. + * + * If video is stopped or ended and play() method was called, video will start over. + */ + public void play() { + play(0); + } + + public void play(int startPosition) { + if (!mIsDataSourceSet) { + log("play() was called but data source was not set."); + return; + } + + mIsPlayCalled = true; + + if (!mIsVideoPrepared) { + log("play() was called but video is not prepared yet, waiting."); + return; + } + + if (!mIsViewAvailable) { + log("play() was called but view is not available yet, waiting."); + return; + } + + if (mState == State.PLAY) { + log("play() was called but video is already playing."); + return; + } + + if (mState == State.PAUSE) { + log("play() was called but video is paused, resuming."); + mState = State.PLAY; + mMediaPlayer.start(); + return; + } + + mState = State.PLAY; + mMediaPlayer.seekTo(startPosition); + mMediaPlayer.start(); + } + + /** + * Pause video. If video is already paused, stopped or ended nothing will happen. + */ + public void pause() { + if (mState == State.PAUSE) { + log("pause() was called but video already paused."); + return; + } + + if (mState == State.STOP) { + log("pause() was called but video already stopped."); + return; + } + + if (mState == State.END) { + log("pause() was called but video already ended."); + return; + } + + mState = State.PAUSE; + if (mMediaPlayer.isPlaying()) { + mMediaPlayer.pause(); + } + } + + /** + * Stop video (pause and seek to beginning). If video is already stopped or ended nothing will + * happen. + */ + public void stop() { + if (mState == State.STOP) { + log("stop() was called but video already stopped."); + return; + } + + if (mState == State.END) { + log("stop() was called but video already ended."); + return; + } + + mState = State.STOP; + if (mMediaPlayer.isPlaying()) { + mMediaPlayer.pause(); + mMediaPlayer.seekTo(0); + } + } + + /** + * @see android.media.MediaPlayer#setLooping(boolean) + */ + public void setLooping(boolean looping) { + mMediaPlayer.setLooping(looping); + } + + /** + * @see android.media.MediaPlayer#seekTo(int) + */ + public void seekTo(int milliseconds) { + mMediaPlayer.seekTo(milliseconds); + } + + /** + * @see android.media.MediaPlayer#getDuration() + */ + public int getDuration() { + return mMediaPlayer.getDuration(); + } + + /** + * @see android.media.MediaPlayer#getCurrentPosition() + */ + public int getCurrentPosition() { return mMediaPlayer.getCurrentPosition(); } + + static void log(String message) { + if (LOG_ON) { + Log.d(TAG, message); + } + } + + private MediaPlayerListener mListener; + + /** + * Listener trigger 'onVideoPrepared' and `onVideoEnd` events + */ + public void setListener(MediaPlayerListener listener) { + mListener = listener; + } + + public interface MediaPlayerListener { + + public void onVideoPrepared(); + + public void onVideoEnd(); + } + + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { + Surface surface = new Surface(surfaceTexture); + mMediaPlayer.setSurface(surface); + mIsViewAvailable = true; + if (mIsDataSourceSet && mIsPlayCalled && mIsVideoPrepared) { + log("View is available and play() was called."); + play(); + } + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) { + + } +} \ No newline at end of file diff --git a/kute-android-app/app/src/main/res/drawable/fb_icon.xml b/kute-android-app/app/src/main/res/drawable/fb_icon.xml new file mode 100644 index 00000000..e2505444 --- /dev/null +++ b/kute-android-app/app/src/main/res/drawable/fb_icon.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/kute-android-app/app/src/main/res/drawable/google_g_logo.xml b/kute-android-app/app/src/main/res/drawable/google_g_logo.xml new file mode 100644 index 00000000..c432cdfa --- /dev/null +++ b/kute-android-app/app/src/main/res/drawable/google_g_logo.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kute-android-app/app/src/main/res/layout/testreg.xml b/kute-android-app/app/src/main/res/layout/testreg.xml index 4b58cb0a..59eef3c4 100644 --- a/kute-android-app/app/src/main/res/layout/testreg.xml +++ b/kute-android-app/app/src/main/res/layout/testreg.xml @@ -1,44 +1,117 @@ - - - - - - - + + android:layout_height="match_parent" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" + android:orientation="vertical"> + + + + +