/*
* Copyright (C) 2008 OpenIntents.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openintents.filemanager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.VisibleForTesting;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import org.openintents.filemanager.bookmarks.BookmarkListActivity;
import org.openintents.filemanager.compatibility.HomeIconHelper;
import org.openintents.filemanager.files.FileHolder;
import org.openintents.filemanager.lists.SimpleFileListFragment;
import org.openintents.filemanager.util.FileUtils;
import org.openintents.filemanager.util.UIUtils;
import org.openintents.intents.FileManagerIntents;
import org.openintents.util.MenuIntentOptionsWithIcons;
import java.io.File;
public class FileManagerActivity extends DistributionLibraryFragmentActivity {
@VisibleForTesting
public static final String FRAGMENT_TAG = "ListFragment";
protected static final int REQUEST_CODE_BOOKMARKS = 1;
private SimpleFileListFragment mFragment;
@Override
protected void onNewIntent(Intent intent) {
if(intent.getData() != null)
mFragment.openInformingPathBar(new FileHolder(FileUtils.getFile(intent.getData()), this));
}
/**
* Either open the file and finish, or navigate to the designated directory. This gives FileManagerActivity the flexibility to actually handle file scheme data of any type.
* @return The folder to navigate to, if applicable. Null otherwise.
*/
private File resolveIntentData(){
File data = FileUtils.getFile(getIntent().getData());
if(data == null)
return null;
if(data.isFile() && ! getIntent().getBooleanExtra(FileManagerIntents.EXTRA_FROM_OI_FILEMANAGER, false)){
FileUtils.openFile(new FileHolder(data, this), this);
finish();
return null;
}
else
return FileUtils.getFile(getIntent().getData());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
UIUtils.setThemeFor(this);
super.onCreate(icicle);
mDistribution.setFirst(MENU_DISTRIBUTION_START,
DIALOG_DISTRIBUTION_START);
// Check whether EULA has been accepted
// or information about new version can be presented.
if (mDistribution.showEulaOrNewVersion()) {
return;
}
// Enable home button.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
HomeIconHelper.activity_actionbar_setHomeButtonEnabled(this);
// Search when the user types.
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
// If not called by name, open on the requested location.
File data = resolveIntentData();
// Add fragment only if it hasn't already been added.
mFragment = (SimpleFileListFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
if(mFragment == null){
mFragment = new SimpleFileListFragment();
Bundle args = new Bundle();
if(data == null)
args.putString(FileManagerIntents.EXTRA_DIR_PATH, Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? Environment.getExternalStorageDirectory().getAbsolutePath() : "/");
else
args.putString(FileManagerIntents.EXTRA_DIR_PATH, data.toString());
mFragment.setArguments(args);
getSupportFragmentManager().beginTransaction().add(android.R.id.content, mFragment, FRAGMENT_TAG).commit();
}
else {
// If we didn't rotate and data wasn't null.
if(icicle == null && data!=null)
mFragment.openInformingPathBar(new FileHolder(new File(data.toString()), this));
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.main, menu);
mDistribution.onCreateOptionsMenu(menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// Generate any additional actions that can be performed on the
// overall list. This allows other applications to extend
// our menu with their own actions.
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
// menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
// new ComponentName(this, NoteEditor.class), null, intent, 0, null);
// Workaround to add icons:
MenuIntentOptionsWithIcons menu2 = new MenuIntentOptionsWithIcons(this,
menu);
menu2.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
new ComponentName(this, FileManagerActivity.class), null,
intent, 0, null);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_search:
onSearchRequested();
return true;
case R.id.menu_settings:
Intent intent = new Intent(this, PreferenceActivity.class);
startActivity(intent);
return true;
case R.id.menu_bookmarks:
startActivityForResult(new Intent(FileManagerActivity.this, BookmarkListActivity.class), REQUEST_CODE_BOOKMARKS);
return true;
case R.id.menu_donate:
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://openintents.org/en/contribute"));
try {
startActivity(intent);
} catch (ActivityNotFoundException e){
// ignore
}
return true;
case android.R.id.home:
mFragment.browseToHome();
return true;
}
return super.onOptionsItemSelected(item);
}
// The following methods should properly handle back button presses on every API Level.
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (VERSION.SDK_INT > VERSION_CODES.DONUT) {
if (keyCode == KeyEvent.KEYCODE_BACK && mFragment.pressBack())
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (VERSION.SDK_INT <= VERSION_CODES.DONUT) {
if (keyCode == KeyEvent.KEYCODE_BACK && mFragment.pressBack())
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* This is called after the file manager finished.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_BOOKMARKS:
if (resultCode == RESULT_OK && data != null) {
mFragment.openInformingPathBar(new FileHolder(new File(data.getStringExtra(BookmarkListActivity.KEY_RESULT_PATH)), this));
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
/**
* We override this, so that we get informed about the opening of the search dialog and start scanning silently.
*/
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putString(FileManagerIntents.EXTRA_SEARCH_INIT_PATH, mFragment.getPath());
startSearch(null, false, appData, false);
return true;
}
}