Video embedded mantains its playback state when the device is turned to other orientation

This commit is contained in:
David A. Velasco 2013-04-26 14:02:17 +02:00
parent 6a6d83311f
commit 6496b9200d
5 changed files with 144 additions and 107 deletions

View file

@ -49,7 +49,8 @@
android:theme="@style/Theme.ownCloud">
<activity
android:name=".ui.activity.FileDisplayActivity"
android:label="@string/app_name">
android:label="@string/app_name"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -143,7 +144,7 @@
<service android:name=".files.services.FileUploader" />
<service android:name=".media.MediaService" />
<activity android:name=".ui.activity.FileDetailActivity" />
<activity android:name=".ui.activity.FileDetailActivity" android:configChanges="orientation|screenSize"/>
<activity android:name=".ui.activity.PinCodeActivity" />
<activity android:name=".extensions.ExtensionsAvailableActivity"></activity>
<activity android:name=".extensions.ExtensionsListActivity"></activity>

View file

@ -18,6 +18,7 @@
package com.owncloud.android.ui.activity;
import android.accounts.Account;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
@ -31,11 +32,13 @@ import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.AccountUtils;
import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
@ -45,10 +48,7 @@ import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
import com.owncloud.android.AccountUtils;
import com.owncloud.android.Log_OC;
import com.owncloud.android.R;
import com.owncloud.android.ui.preview.PreviewVideoActivity;
/**
* This activity displays the details of a file like its name, its size and so
@ -69,7 +69,6 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
public static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
private boolean mConfigurationChangedToLandscape = false;
private FileDownloaderBinder mDownloaderBinder = null;
private ServiceConnection mDownloadConnection, mUploadConnection = null;
private FileUploaderBinder mUploaderBinder = null;
@ -90,35 +89,22 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
mAccount = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT);
mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
// check if configuration changed to large-land ; for a tablet being changed from portrait to landscape when in FileDetailActivity
Configuration conf = getResources().getConfiguration();
mConfigurationChangedToLandscape = (conf.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
);
setContentView(R.layout.file_activity_details);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
if (!mConfigurationChangedToLandscape) {
setContentView(R.layout.file_activity_details);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
mWaitingToPreview = false;
createChildFragment();
} else {
mWaitingToPreview = savedInstanceState.getBoolean(KEY_WAITING_TO_PREVIEW);
}
mDownloadConnection = new DetailsServiceConnection();
bindService(new Intent(this, FileDownloader.class), mDownloadConnection, Context.BIND_AUTO_CREATE);
mUploadConnection = new DetailsServiceConnection();
bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE);
} else {
backToDisplayActivity(false); // the 'back' won't be effective until this.onStart() and this.onResume() are completed;
if (savedInstanceState == null) {
mWaitingToPreview = false;
createChildFragment();
} else {
mWaitingToPreview = savedInstanceState.getBoolean(KEY_WAITING_TO_PREVIEW);
}
mDownloadConnection = new DetailsServiceConnection();
bindService(new Intent(this, FileDownloader.class), mDownloadConnection, Context.BIND_AUTO_CREATE);
mUploadConnection = new DetailsServiceConnection();
bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE);
}
/**
@ -131,7 +117,9 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
Fragment newFragment = null;
if (PreviewMediaFragment.canBePreviewed(mFile) && mode == MODE_PREVIEW) {
if (mFile.isDown()) {
newFragment = new PreviewMediaFragment(mFile, mAccount);
int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
newFragment = new PreviewMediaFragment(mFile, mAccount, startPlaybackPosition, autoplay);
} else {
newFragment = new FileDetailFragment(mFile, mAccount);
@ -147,6 +135,43 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
}
@Override
public void onConfigurationChanged (Configuration newConfig) {
super.onConfigurationChanged(newConfig);
finish();
Intent intent = null;
if ((newConfig.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
&& newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
intent = new Intent(this, FileDisplayActivity.class);
intent .putExtra(FileDetailFragment.EXTRA_FILE, mFile);
intent .putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
intent.putExtra(EXTRA_MODE, getIntent().getIntExtra(EXTRA_MODE, MODE_PREVIEW));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null && mFile != null && fragment instanceof PreviewMediaFragment && mFile.isVideo()) {
PreviewMediaFragment videoFragment = (PreviewMediaFragment)fragment;
intent.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, videoFragment.getPosition());
intent.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, videoFragment.isPlaying());
}
} else {
intent = new Intent(this, FileDetailActivity.class);
intent .putExtra(FileDetailFragment.EXTRA_FILE, mFile);
intent .putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
intent.putExtra(EXTRA_MODE, getIntent().getIntExtra(EXTRA_MODE, MODE_PREVIEW));
Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null && mFile != null && fragment instanceof PreviewMediaFragment && mFile.isVideo()) {
PreviewMediaFragment videoFragment = (PreviewMediaFragment)fragment;
intent.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, videoFragment.getPosition());
intent.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, videoFragment.isPlaying());
}
// and maybe 'waiting to preview' flag
}
startActivity(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
@ -167,13 +192,12 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
@Override
public void onResume() {
super.onResume();
if (!mConfigurationChangedToLandscape) {
// TODO this is probably unnecessary
Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null && fragment instanceof FileDetailFragment) {
((FileDetailFragment) fragment).updateFileDetails(false, false);
}
// TODO this is probably unnecessary
Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null && fragment instanceof FileDetailFragment) {
((FileDetailFragment) fragment).updateFileDetails(false, false);
}
// Listen for download messages
IntentFilter downloadIntentFilter = new IntentFilter(FileDownloader.DOWNLOAD_ADDED_MESSAGE);
downloadIntentFilter.addAction(FileDownloader.DOWNLOAD_FINISH_MESSAGE);
@ -243,7 +267,8 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
switch(item.getItemId()){
case android.R.id.home:
backToDisplayActivity(true);
//backToDisplayActivity();
onBackPressed();
returnValue = true;
break;
default:
@ -253,12 +278,14 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
return returnValue;
}
private void backToDisplayActivity(boolean moveToParent) {
//private void backToDisplayActivity() {
@Override
public void onBackPressed() {
Intent intent = new Intent(this, FileDisplayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
OCFile targetFile = null;
if (mFile != null) {
targetFile = moveToParent ? mStorageManager.getFileById(mFile.getParentId()) : mFile;
targetFile = mStorageManager.getFileById(mFile.getParentId());
}
intent.putExtra(FileDetailFragment.EXTRA_FILE, targetFile);
intent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, mAccount);
@ -266,7 +293,6 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
finish();
}
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
@ -375,7 +401,7 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
if (success && mWaitingToPreview) {
mFile = mStorageManager.getFileById(mFile.getFileId()); // update the file from database, for the local storage path
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment, new PreviewMediaFragment(mFile, mAccount), FileDetailFragment.FTAG);
transaction.replace(R.id.fragment, new PreviewMediaFragment(mFile, mAccount, 0, true), FileDetailFragment.FTAG);
transaction.commit();
mWaitingToPreview = false;

View file

@ -35,8 +35,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.res.Configuration;
import android.content.res.Resources.NotFoundException;
import android.database.Cursor;
import android.net.Uri;
@ -83,7 +82,6 @@ import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.syncadapter.FileSyncService;
import com.owncloud.android.ui.dialog.ChangelogDialog;
import com.owncloud.android.ui.dialog.EditNameDialog;
import com.owncloud.android.ui.dialog.SslValidatorDialog;
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
@ -94,6 +92,7 @@ import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.ui.preview.PreviewImageActivity;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
import com.owncloud.android.ui.preview.PreviewVideoActivity;
import eu.alefzero.webdav.WebdavClient;
@ -206,21 +205,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
setContentView(R.layout.files);
mFileList = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);
mDualPane = (findViewById(R.id.file_details_container) != null);
if (mDualPane) {
if (savedInstanceState == null) initFileDetailsInDualPane();
} else {
// quick patchES to fix problem in turn from landscape to portrait, when a file is selected in the right pane
// TODO serious refactorization in activities and fragments providing file browsing and handling
if (mCurrentFile != null) {
onFileClick(mCurrentFile);
mCurrentFile = null;
}
Fragment rightPanel = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (rightPanel != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove(rightPanel);
transaction.commit();
}
if (mDualPane && savedInstanceState == null) {
initFileDetailsInDualPane();
}
// Action bar setup
@ -233,40 +219,37 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
setSupportProgressBarIndeterminateVisibility(false); // always AFTER setContentView(...) ; to workaround bug in its implementation
// show changelog, if needed
//showChangeLog();
mBackFromCreatingFirstAccount = false;
Log_OC.d(getClass().toString(), "onCreate() end");
}
/**
* Shows a dialog with the change log of the current version after each app update
*
* TODO make it permanent; by now, only to advice the workaround app for 4.1.x
*/
private void showChangeLog() {
if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.JELLY_BEAN) {
final String KEY_VERSION = "version";
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int currentVersionNumber = 0;
int savedVersionNumber = sharedPref.getInt(KEY_VERSION, 0);
try {
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
currentVersionNumber = pi.versionCode;
} catch (Exception e) {}
if (currentVersionNumber > savedVersionNumber) {
ChangelogDialog.newInstance(true).show(getSupportFragmentManager(), DIALOG_CHANGELOG_TAG);
Editor editor = sharedPref.edit();
editor.putInt(KEY_VERSION, currentVersionNumber);
editor.commit();
}
@Override
public void onConfigurationChanged (Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FileFragment fragment = (FileFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null
&& fragment.getFile() != null
&& (newConfig.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
&& newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) {
onFileClick(fragment.getFile(), true);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove((Fragment)fragment);
transaction.commit();
} else {
finish();
Intent intent = new Intent(this, FileDisplayActivity.class);
intent .putExtra(FileDetailFragment.EXTRA_FILE, mCurrentDir);
intent .putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
startActivity(intent);
}
}
/**
* Launches the account creation activity. To use when no ownCloud account is available
*/
@ -315,7 +298,9 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
if (mCurrentFile != null) {
if (PreviewMediaFragment.canBePreviewed(mCurrentFile)) {
if (mCurrentFile.isDown()) {
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this), startPlaybackPosition, autoplay), FileDetailFragment.FTAG);
} else {
transaction.replace(R.id.file_details_container, new FileDetailFragment(mCurrentFile, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
mWaitingToPreview = mCurrentFile;
@ -1036,7 +1021,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
if (success && waitedPreview) {
mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mWaitingToPreview, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(mWaitingToPreview, AccountUtils.getCurrentOwnCloudAccount(this), 0, true), FileDetailFragment.FTAG);
transaction.commit();
mWaitingToPreview = null;
@ -1082,7 +1067,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
* {@inheritDoc}
*/
@Override
public void onFileClick(OCFile file) {
public void onFileClick(OCFile file, boolean onOrientationChange) {
if (file != null && PreviewImageFragment.canBePreviewed(file)) {
// preview image - it handles the download, if needed
startPreviewImage(file);
@ -1090,16 +1075,28 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
} else if (file != null && PreviewMediaFragment.canBePreviewed(file)) {
if (file.isDown()) {
// general preview
startMediaPreview(file);
if (!onOrientationChange) {
startMediaPreview(file, 0, true, onOrientationChange);
} else {
int startPlaybackPosition = 0;
boolean autoplay = true;
Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);
if (fragment != null && file.isVideo()) {
PreviewMediaFragment videoFragment = (PreviewMediaFragment)fragment;
startPlaybackPosition = videoFragment.getPosition();
autoplay = videoFragment.isPlaying();
}
startMediaPreview(file, startPlaybackPosition, autoplay, onOrientationChange);
}
} else {
// automatic download, preview on finish
startDownloadForPreview(file);
startDownloadForPreview(file, onOrientationChange);
}
} else {
// details view
startDetails(file);
startDetails(file, onOrientationChange);
}
}
@ -1110,22 +1107,24 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
startActivity(showDetailsIntent);
}
private void startMediaPreview(OCFile file) {
if (mDualPane) {
private void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay, boolean onOrientationChange) {
if (mDualPane && !onOrientationChange) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
transaction.replace(R.id.file_details_container, new PreviewMediaFragment(file, AccountUtils.getCurrentOwnCloudAccount(this), startPlaybackPosition, autoplay), FileDetailFragment.FTAG);
transaction.commit();
} else {
Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);
showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);
showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
showDetailsIntent.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, startPlaybackPosition);
showDetailsIntent.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, autoplay);
startActivity(showDetailsIntent);
}
}
private void startDownloadForPreview(OCFile file) {
if (mDualPane) {
private void startDownloadForPreview(OCFile file, boolean onOrientationChange) {
if (mDualPane && !onOrientationChange) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
transaction.commit();
@ -1141,8 +1140,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
}
private void startDetails(OCFile file) {
if (mDualPane && !file.isImage()) {
private void startDetails(OCFile file, boolean onOrientationChange) {
if (mDualPane && !file.isImage() && !onOrientationChange) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);
transaction.commit();

View file

@ -144,7 +144,7 @@ public class OCFileListFragment extends FragmentListView implements EditNameDial
mContainerActivity.onDirectoryClick(file);
} else { /// Click on a file
mContainerActivity.onFileClick(file);
mContainerActivity.onFileClick(file, false);
}
} else {
@ -440,7 +440,7 @@ public class OCFileListFragment extends FragmentListView implements EditNameDial
*
* @param file
*/
public void onFileClick(OCFile file);
public void onFileClick(OCFile file, boolean realClick);
/**
* Getter for the current DataStorageManager in the container activity

View file

@ -120,12 +120,12 @@ public class PreviewMediaFragment extends SherlockFragment implements
* @param fileToDetail An {@link OCFile} to preview in the fragment
* @param ocAccount An ownCloud account; needed to start downloads
*/
public PreviewMediaFragment(OCFile fileToDetail, Account ocAccount) {
public PreviewMediaFragment(OCFile fileToDetail, Account ocAccount, int startPlaybackPosition, boolean autoplay) {
mFile = fileToDetail;
mAccount = ocAccount;
mSavedPlaybackPosition = 0;
mSavedPlaybackPosition = startPlaybackPosition;
mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
mAutoplay = true;
mAutoplay = autoplay;
}
@ -752,5 +752,16 @@ public class PreviewMediaFragment extends SherlockFragment implements
container.finish();
}
}
public int getPosition() {
mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
return mSavedPlaybackPosition;
}
public boolean isPlaying() {
mAutoplay = mVideoPreview.isPlaying();
return mAutoplay;
}
}