Show the 'search' layout in phone and tablet

This commit is contained in:
masensio 2015-10-14 12:58:07 +02:00 committed by David A. Velasco
parent bc5687b74a
commit 905b68b4ec
18 changed files with 633 additions and 223 deletions

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- <?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application ownCloud Android client application
Copyright (C) 2012 Bartek Przybylski Copyright (C) 2012 Bartek Przybylski
@ -15,10 +16,15 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<manifest package="com.owncloud.android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.owncloud.android"
android:versionCode="10800000" android:versionCode="10800000"
android:versionName="1.8.0" xmlns:android="http://schemas.android.com/apk/res/android"> android:versionName="1.8.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />
@ -31,44 +37,42 @@
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk <android:uses-permission android:name="android.permission.READ_PHONE_STATE" />
android:minSdkVersion="14" <android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application <application
android:name=".MainApp" android:name=".MainApp"
android:icon="@drawable/icon" android:icon="@drawable/icon"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.ownCloud"> android:theme="@style/Theme.ownCloud" >
<activity <activity
android:name=".ui.activity.FileDisplayActivity" android:name=".ui.activity.FileDisplayActivity"
android:label="@string/app_name"> android:label="@string/app_name" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".ui.activity.UploadFilesActivity"></activity> <activity android:name=".ui.activity.UploadFilesActivity" />
<activity android:name=".ui.activity.Uploader"> <activity android:name=".ui.activity.Uploader" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.SEND"></action> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*"></data> <data android:mimeType="*/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE"></action> <action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*"></data>
<data android:mimeType="*/*" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
@ -77,18 +81,16 @@
</activity> </activity>
<activity <activity
android:name=".ui.preview.PreviewImageActivity" android:name=".ui.preview.PreviewImageActivity"
android:theme="@style/Theme.ownCloud.Overlay" android:theme="@style/Theme.ownCloud.Overlay" />
/>
<activity <activity
android:name=".ui.preview.PreviewVideoActivity" android:name=".ui.preview.PreviewVideoActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.ownCloud.Fullscreen"></activity> android:theme="@style/Theme.ownCloud.Fullscreen" />
<service <service
android:name=".authentication.AccountAuthenticatorService" android:name=".authentication.AccountAuthenticatorService"
android:exported="true"> android:exported="true" >
<intent-filter android:priority="100"> <intent-filter android:priority="100" >
<action android:name="android.accounts.AccountAuthenticator" /> <action android:name="android.accounts.AccountAuthenticator" />
</intent-filter> </intent-filter>
@ -98,7 +100,7 @@
</service> </service>
<service <service
android:name=".syncadapter.FileSyncService" android:name=".syncadapter.FileSyncService"
android:exported="true"> android:exported="true" >
<intent-filter> <intent-filter>
<action android:name="android.content.SyncAdapter" /> <action android:name="android.content.SyncAdapter" />
</intent-filter> </intent-filter>
@ -114,13 +116,13 @@
android:enabled="true" android:enabled="true"
android:exported="false" android:exported="false"
android:label="@string/sync_string_files" android:label="@string/sync_string_files"
android:syncable="true"></provider> android:syncable="true" />
<activity <activity
android:name=".authentication.AuthenticatorActivity" android:name=".authentication.AuthenticatorActivity"
android:exported="true" android:exported="true"
android:theme="@style/Theme.ownCloud.noActionBar" android:launchMode="singleTask"
android:launchMode="singleTask"> android:theme="@style/Theme.ownCloud.noActionBar" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
@ -131,6 +133,7 @@
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="com.owncloud.android.workaround.accounts.CREATE" /> <action android:name="com.owncloud.android.workaround.accounts.CREATE" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
@ -141,48 +144,53 @@
<service android:name=".media.MediaService" /> <service android:name=".media.MediaService" />
<activity android:name=".ui.activity.PassCodeActivity" /> <activity android:name=".ui.activity.PassCodeActivity" />
<activity android:name=".ui.activity.ConflictsResolveActivity"/> <activity android:name=".ui.activity.ConflictsResolveActivity" />
<activity android:name=".ui.activity.GenericExplanationActivity"/> <activity android:name=".ui.activity.GenericExplanationActivity" />
<activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity"/> <activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity" />
<activity android:name=".ui.activity.LogHistoryActivity" />
<activity android:name=".ui.activity.LogHistoryActivity"/> <receiver android:name=".files.InstantUploadBroadcastReceiver" >
<receiver android:name=".files.InstantUploadBroadcastReceiver">
<intent-filter> <intent-filter>
<!-- unofficially supported by many Android phones but not by HTC devices: --> <!-- unofficially supported by many Android phones but not by HTC devices: -->
<action android:name="com.android.camera.NEW_PICTURE" /> <action android:name="com.android.camera.NEW_PICTURE" />
<!-- officially supported since Android 4.0 (SDK 14, works even for HTC devices): --> <!-- officially supported since Android 4.0 (SDK 14, works even for HTC devices): -->
<action android:name="android.hardware.action.NEW_PICTURE" /> <action android:name="android.hardware.action.NEW_PICTURE" />
<data android:mimeType="image/*" /> <data android:mimeType="image/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.hardware.action.NEW_VIDEO" /> <action android:name="android.hardware.action.NEW_VIDEO" />
<data android:mimeType="video/*" /> <data android:mimeType="video/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".files.BootupBroadcastReceiver"> <receiver android:name=".files.BootupBroadcastReceiver" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<service android:name=".services.observer.FileObserverService"/>
<service android:name=".services.observer.FileObserverService" />
<activity <activity
android:name=".ui.activity.CopyToClipboardActivity" android:name=".ui.activity.CopyToClipboardActivity"
android:label="@string/copy_link" android:icon="@drawable/copy_link"
android:icon="@drawable/copy_link"/> android:label="@string/copy_link" />
<activity <activity
android:name=".ui.activity.FolderPickerActivity" android:name=".ui.activity.FolderPickerActivity"
android:label="@string/app_name"/> android:label="@string/app_name" />
<activity <activity
android:name=".ui.activity.UploadPathActivity" android:name=".ui.activity.UploadPathActivity"
android:label="@string/app_name"/> android:label="@string/app_name" />
<activity
android:name=".ui.activity.ShareActivity"
android:label="@string/share_dialog_title"
android:theme="@style/Theme.ownCloud.Dialog" >
</activity>
</application> </application>
</manifest> </manifest>

View file

@ -20,10 +20,11 @@ repositories {
dependencies { dependencies {
compile name: 'touch-image-view' compile name: 'touch-image-view'
compile 'com.android.support:support-v4:22.2.1'
compile project(':owncloud-android-library') compile project(':owncloud-android-library')
compile 'com.android.support:support-v4:22.2.1'
compile 'com.jakewharton:disklrucache:2.0.2' compile 'com.jakewharton:disklrucache:2.0.2'
compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:design:22.2.1'
} }
android { android {
@ -68,3 +69,7 @@ android {
} }

View file

@ -1,4 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
This program 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View file

@ -1,8 +1,27 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
This program 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical"
android:id="@+id/search_layout"
android:minWidth="200dp">
<SearchView <SearchView
android:layout_width="match_parent" android:layout_width="match_parent"
@ -11,8 +30,9 @@
android:hint="@string/share_search"/> android:hint="@string/share_search"/>
<ListView <ListView
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:id="@+id/searchUsersListView" /> android:id="@+id/searchUsersListView"
android:scrollbars="vertical"/>
</LinearLayout> </LinearLayout>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
This program 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<android.support.design.widget.CoordinatorLayout
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"
tools:context="com.owncloud.android.ui.activity.ShareActivity">
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent" android:theme="@style/Theme.ownCloud.AppBarOverlay">
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/Theme.ownCloud.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/share_fragment_container">
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>

View file

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
This program 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.owncloud.android.ui.dialog.ShareFileDialogFragment">
<ScrollView
android:id="@+id/shareScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="8dp">
<RelativeLayout
android:id="@+id/shareHeaderContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<ImageView
android:id="@+id/shareFileIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/file"
android:layout_margin="8dp"
android:maxHeight="96dp"
android:maxWidth="96dp"/>
<TextView
android:id="@+id/shareFileName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/placeholder_filename"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_marginTop="39dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/shareFileIcon"
android:layout_toEndOf="@+id/shareFileIcon" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/placeholder_filesize"
android:id="@+id/shareFileSize"
android:layout_below="@+id/shareFileName"
android:layout_toRightOf="@+id/shareFileIcon"
android:layout_toEndOf="@+id/shareFileIcon"
android:layout_marginTop="12dp" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/share_with_user_section_title"
android:id="@+id/shareWithUsersSectionTitle"
android:layout_gravity="left"
android:padding="8dp"
android:background="@color/actionbar_start_color"
android:textColor="@color/white"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/shareUsersList"
android:visibility="gone" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/shareNoUsers"
android:text="@string/share_no_users"
android:padding="12dp" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/addUserButton"
style="@style/ownCloud.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/share_add_user_or_group"
android:contentDescription="shareAddUserButton"/>
</LinearLayout>
</ScrollView>
</FrameLayout>

View file

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
This program 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.owncloud.android.ui.fragment.ShareFileFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_material_light"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/shareHeaderContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@color/background_color">
<ImageView
android:id="@+id/shareFileIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="96dp"
android:layout_margin="12dp"
android:src="@drawable/file" />
<TextView
android:id="@+id/shareFileName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/placeholder_filename"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_marginTop="39dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/shareFileIcon"
android:layout_toEndOf="@+id/shareFileIcon" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/placeholder_filesize"
android:id="@+id/shareFileSize"
android:layout_below="@+id/shareFileName"
android:layout_toRightOf="@+id/shareFileIcon"
android:layout_toEndOf="@+id/shareFileIcon"
android:layout_marginTop="12dp" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/share_with_user_section_title"
android:id="@+id/shareWithUsersSectionTitle"
android:layout_gravity="left"
android:padding="8dp"
android:background="@color/actionbar_start_color"
android:textColor="@color/white"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/shareUsersList"
android:visibility="gone"
android:scrollbars="vertical"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/shareNoUsers"
android:text="@string/share_no_users"
android:padding="12dp" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/addUserButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_input_add"
android:contentDescription="shareAddUserButton"
app:backgroundTint="@color/actionbar_start_color"
app:rippleColor="@color/background_color" />
</LinearLayout>
</FrameLayout>

View file

@ -18,5 +18,11 @@
--> -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ProgressDialogTheme" parent="ownCloud.Dialog"> <style name="ProgressDialogTheme" parent="ownCloud.Dialog">
</style>>
<style name="Theme.ownCloud.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style> </style>
</resources> </resources>

View file

@ -0,0 +1,6 @@
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>

5
res/values/dimens.xml Normal file
View file

@ -0,0 +1,5 @@
<resources>
<dimen name="app_bar_height">180dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="text_margin">16dp</dimen>
</resources>

View file

@ -224,4 +224,10 @@
<color name="setup_text_hint">#777777</color> <color name="setup_text_hint">#777777</color>
<color name="setup_text_typed">#000000</color> <color name="setup_text_typed">#000000</color>
<style name="Theme.ownCloud.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.ownCloud.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.ownCloud.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources> </resources>

View file

@ -43,7 +43,7 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import com.owncloud.android.services.OperationsService; import com.owncloud.android.services.OperationsService;
import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.services.observer.FileObserverService;
import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.dialog.ShareFileDialogFragment; import com.owncloud.android.ui.activity.ShareActivity;
import com.owncloud.android.ui.dialog.ShareLinkToDialog; import com.owncloud.android.ui.dialog.ShareLinkToDialog;
import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HTTP;
@ -226,9 +226,10 @@ public class FileOperationsHelper {
} }
public void showShareFile(OCFile file){ public void showShareFile(OCFile file){
ShareFileDialogFragment dialog = Intent intent = new Intent(mFileActivity, ShareActivity.class);
ShareFileDialogFragment.newInstance(file, mFileActivity.getAccount()); intent.putExtra(mFileActivity.EXTRA_FILE, file);
dialog.show(mFileActivity.getSupportFragmentManager(), mFileActivity.DIALOG_SHARE_FILE); intent.putExtra(mFileActivity.EXTRA_ACCOUNT, mFileActivity.getAccount());
mFileActivity.startActivity(intent);
} }

View file

@ -100,7 +100,6 @@ public class FileActivity extends AppCompatActivity
public static final String TAG = FileActivity.class.getSimpleName(); public static final String TAG = FileActivity.class.getSimpleName();
private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
public static final String DIALOG_SHARE_FILE = "DIALOG_SHARE_FILE";
private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID"; private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID";
private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD"; private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD";

View file

@ -90,8 +90,6 @@ import com.owncloud.android.services.observer.FileObserverService;
import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.syncadapter.FileSyncAdapter;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
import com.owncloud.android.ui.dialog.ShareFileDialogFragment;
import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener;
import com.owncloud.android.ui.dialog.UploadSourceDialogFragment; import com.owncloud.android.ui.dialog.UploadSourceDialogFragment;
@ -1237,9 +1235,10 @@ public class FileDisplayActivity extends HookActivity
*/ */
@Override @Override
public void showShareFile(OCFile file) { public void showShareFile(OCFile file) {
ShareFileDialogFragment dialog = Intent intent = new Intent(this, ShareActivity.class);
ShareFileDialogFragment.newInstance(file, getAccount()); intent.putExtra(EXTRA_FILE, file);
dialog.show(getSupportFragmentManager(), DIALOG_SHARE_FILE); intent.putExtra(EXTRA_ACCOUNT, getAccount());
startActivity(intent);
} }
@Override @Override

View file

@ -0,0 +1,138 @@
/**
* ownCloud Android client application
*
* @author masensio
* Copyright (C) 2015 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* This program 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.owncloud.android.ui.activity;
import android.accounts.Account;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.fragment.SearchFragment;
import com.owncloud.android.ui.fragment.ShareFileFragment;
/**
* Activity for sharing files
*/
public class ShareActivity extends AppCompatActivity
implements ShareFileFragment.OnShareFragmentInteractionListener,
SearchFragment.OnSearchFragmentInteractionListener {
private static final String TAG_SHARE_FRAGMENT = "SHARE_FRAGMENT";
private static final String TAG_SEARCH_FRAGMENT = "SEARCH_USER_AND_GROUPS_FRAGMENT";
private Account mAccount;
private OCFile mFile;
private ShareFileFragment mShareFileFragment;
private SearchFragment mSearchFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.share_activity);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (savedInstanceState != null) {
mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
mShareFileFragment = (ShareFileFragment) getSupportFragmentManager().
getFragment(savedInstanceState, TAG_SHARE_FRAGMENT);
mSearchFragment = (SearchFragment) getSupportFragmentManager().
getFragment(savedInstanceState, TAG_SEARCH_FRAGMENT);
if (mShareFileFragment != null){
ft.replace(R.id.share_fragment_container, mShareFileFragment, TAG_SHARE_FRAGMENT);
if (mSearchFragment != null){
ft.hide(mShareFileFragment);
ft.add(R.id.share_fragment_container, mSearchFragment, TAG_SEARCH_FRAGMENT);
ft.addToBackStack(TAG_SEARCH_FRAGMENT);
}
ft.commit();
}
} else {
// Read Extras
mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
mAccount = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
// Add Share fragment
mShareFileFragment = ShareFileFragment.newInstance(mFile, mAccount);
ft.replace(R.id.share_fragment_container, mShareFileFragment, TAG_SHARE_FRAGMENT);
ft.commit();
mSearchFragment = null;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(FileActivity.EXTRA_FILE, mFile);
outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
//Save the fragment's instance
getSupportFragmentManager().putFragment(outState, TAG_SHARE_FRAGMENT, mShareFileFragment);
if (mSearchFragment != null) {
getSupportFragmentManager().putFragment(outState, TAG_SEARCH_FRAGMENT, mSearchFragment);
}
}
@Override
public void showSearchUsersAndGroups() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
mSearchFragment = SearchFragment.newInstance(mFile, mAccount);
ft.hide(mShareFileFragment);
ft.add(R.id.share_fragment_container, mSearchFragment, TAG_SEARCH_FRAGMENT);
ft.addToBackStack(TAG_SEARCH_FRAGMENT);
ft.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mSearchFragment != null){
getSupportFragmentManager().popBackStackImmediate();
mSearchFragment = null;
}
}
@Override
public void onShareFragmentInteraction(Uri uri) {
}
@Override
public void onSearchFragmentInteraction(Uri uri) {
}
}

View file

@ -0,0 +1,138 @@
/**
* ownCloud Android client application
*
* @author masensio
* Copyright (C) 2015 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* This program 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.owncloud.android.ui.fragment;
import android.accounts.Account;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
/**
* Fragment for Searching users and groups
*
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link SearchFragment.OnSearchFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link SearchFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class SearchFragment extends Fragment {
private static final String TAG = ShareFileFragment.class.getSimpleName();
// the fragment initialization parameters
private static final String ARG_FILE = "FILE";
private static final String ARG_ACCOUNT = "ACCOUNT";
// Parameters
private OCFile mFile;
private Account mAccount;
private OnSearchFragmentInteractionListener mListener;
/**
* Public factory method to create new SearchFragment instances.
*
* @param fileToShare An {@link OCFile} to show in the fragment
* @param account An ownCloud account
* @return A new instance of fragment SearchFragment.
*/
// TODO: Rename and change types and number of parameters
public static SearchFragment newInstance(OCFile fileToShare, Account account) {
SearchFragment fragment = new SearchFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_FILE, fileToShare);
args.putParcelable(ARG_ACCOUNT, account);
fragment.setArguments(args);
return fragment;
}
public SearchFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mFile = getArguments().getParcelable(ARG_FILE);
mAccount = getArguments().getParcelable(ARG_ACCOUNT);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.search_users_groups_layout, container, false);
return view;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onSearchFragmentInteraction(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnSearchFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
// TODO: review if it is necessary
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnSearchFragmentInteractionListener {
// TODO: Update argument type and name
public void onSearchFragmentInteraction(Uri uri);
}
}

View file

@ -18,19 +18,18 @@
* *
*/ */
package com.owncloud.android.ui.dialog; package com.owncloud.android.ui.fragment;
import android.accounts.Account; import android.accounts.Account;
import android.app.Dialog; import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.app.Fragment; import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -41,20 +40,17 @@ import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimetypeIconUtil; import com.owncloud.android.utils.MimetypeIconUtil;
/** /**
* Fragment for Sharing a file with users
*
* A simple {@link Fragment} subclass. * A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the * Activities that contain this fragment must implement the
* {@link ShareFileDialogFragment.OnFragmentInteractionListener} interface * {@link ShareFileFragment.OnShareFragmentInteractionListener} interface
* to handle interaction events. * to handle interaction events.
* Use the {@link ShareFileDialogFragment#newInstance} factory method to * Use the {@link ShareFileFragment#newInstance} factory method to
* create an instance of this fragment. * create an instance of this fragment.
*
* Dialog Fragment to show the share options of a file/folder
*
* Search the users and share with them
*/ */
public class ShareFileDialogFragment extends DialogFragment public class ShareFileFragment extends Fragment {
implements DialogInterface.OnClickListener{ private static final String TAG = ShareFileFragment.class.getSimpleName();
private static final String TAG = ShareFileDialogFragment.class.getSimpleName();
// the fragment initialization parameters // the fragment initialization parameters
private static final String ARG_FILE = "FILE"; private static final String ARG_FILE = "FILE";
@ -64,17 +60,17 @@ public class ShareFileDialogFragment extends DialogFragment
private OCFile mFile; private OCFile mFile;
private Account mAccount; private Account mAccount;
private OnFragmentInteractionListener mListener; private OnShareFragmentInteractionListener mListener;
/** /**
* Public factory method to create new ShareFileDialogFragment instances. * Public factory method to create new ShareFileFragment instances.
* *
* @param fileToShare An {@link OCFile} to show in the fragment * @param fileToShare An {@link OCFile} to show in the fragment
* @param account An ownCloud account * @param account An ownCloud account
* @return A new instance of fragment ShareFragment. * @return A new instance of fragment ShareFileFragment.
*/ */
public static ShareFileDialogFragment newInstance(OCFile fileToShare, Account account) { public static ShareFileFragment newInstance(OCFile fileToShare, Account account) {
ShareFileDialogFragment fragment = new ShareFileDialogFragment(); ShareFileFragment fragment = new ShareFileFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelable(ARG_FILE, fileToShare); args.putParcelable(ARG_FILE, fileToShare);
args.putParcelable(ARG_ACCOUNT, account); args.putParcelable(ARG_ACCOUNT, account);
@ -82,7 +78,7 @@ public class ShareFileDialogFragment extends DialogFragment
return fragment; return fragment;
} }
public ShareFileDialogFragment() { public ShareFileFragment() {
// Required empty public constructor // Required empty public constructor
} }
@ -96,11 +92,10 @@ public class ShareFileDialogFragment extends DialogFragment
} }
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for the dialog // Inflate the layout for this fragment
LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.share_file_layout, container, false);
View view = inflater.inflate(R.layout.share_file_dialog, null);
// Setup layout // Setup layout
// Image // Image
@ -125,21 +120,45 @@ public class ShareFileDialogFragment extends DialogFragment
size.setText(DisplayUtils.bytesToHumanReadable(mFile.getFileLength())); size.setText(DisplayUtils.bytesToHumanReadable(mFile.getFileLength()));
} }
// Build the dialog // Add User Button
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); FloatingActionButton addUserGroupButton = (FloatingActionButton)
builder.setView(view) view.findViewById(R.id.addUserButton);
.setPositiveButton(R.string.common_ok, this) addUserGroupButton.setOnClickListener(new View.OnClickListener() {
.setTitle(R.string.share_dialog_title); @Override
public void onClick(View view) {
// Show Search Fragment
mListener.showSearchUsersAndGroups();
}
});
Dialog d = builder.create(); return view;
return d; }
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onShareFragmentInteraction(uri);
}
} }
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnShareFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnShareFragmentInteractionListener");
}
} }
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
// TODO: review if it is necessary
/** /**
* This interface must be implemented by activities that contain this * This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated * fragment to allow an interaction in this fragment to be communicated
@ -150,9 +169,10 @@ public class ShareFileDialogFragment extends DialogFragment
* "http://developer.android.com/training/basics/fragments/communicating.html" * "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information. * >Communicating with Other Fragments</a> for more information.
*/ */
public interface OnFragmentInteractionListener { public interface OnShareFragmentInteractionListener {
// TODO: Update argument type and name public void showSearchUsersAndGroups();
public void onFragmentInteraction(Uri uri);
public void onShareFragmentInteraction(Uri uri);
} }
} }

View file

@ -59,7 +59,7 @@ import com.owncloud.android.operations.SynchronizeFileOperation;
import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.operations.UnshareLinkOperation;
import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.dialog.ShareFileDialogFragment; import com.owncloud.android.ui.activity.ShareActivity;
import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.FileFragment;
@ -407,9 +407,10 @@ public class PreviewImageActivity extends FileActivity implements
*/ */
@Override @Override
public void showShareFile(OCFile file) { public void showShareFile(OCFile file) {
ShareFileDialogFragment dialog = Intent intent = new Intent(this, ShareActivity.class);
ShareFileDialogFragment.newInstance(file, getAccount()); intent.putExtra(EXTRA_FILE, file);
dialog.show(getSupportFragmentManager(), DIALOG_SHARE_FILE); intent.putExtra(EXTRA_ACCOUNT, getAccount());
startActivity(intent);
} }
private void requestForDownload(OCFile file) { private void requestForDownload(OCFile file) {
if (mDownloaderBinder == null) { if (mDownloaderBinder == null) {