/*
* Copyright (C) 2012 The CyanogenMod Project
*
* 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 com.cyanogenmod.filemanager.activities;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.console.ConsoleBuilder;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import com.cyanogenmod.filemanager.ui.policy.IntentsActionPolicy;
import com.cyanogenmod.filemanager.util.CommandHelper;
import com.cyanogenmod.filemanager.util.DialogHelper;
import com.cyanogenmod.filemanager.util.ExceptionUtil;
/**
* The activity for handle the desktop shortcuts create by the app.
*/
public class ShortcutActivity extends Activity implements OnCancelListener, OnDismissListener {
private static final String TAG = "ShortcutActivity"; //$NON-NLS-1$
private static boolean DEBUG = false;
private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if (intent.getAction().compareTo(FileManagerSettings.INTENT_THEME_CHANGED) == 0) {
applyTheme();
}
}
}
};
/**
* Constant for extra information about the type of the shortcut.<br/>
* <br/>
* <ul>
* <li><code>navigate</code>. For folders</li>
* <li><code>open</code>. For files</li>
* </ul>
*/
public static final String EXTRA_TYPE = "extra_shortcut_type"; //$NON-NLS-1$
/**
* Constant for extra information about the absolute path
*/
public static final String EXTRA_FSO = "extra_shortcut_fso"; //$NON-NLS-1$
/**
* Navigable shortcut type.
*/
public static final String SHORTCUT_TYPE_NAVIGATE = "navigate"; //$NON-NLS-1$
/**
* Openable shortcut type.
*/
public static final String SHORTCUT_TYPE_OPEN = "open"; //$NON-NLS-1$
/**
* {@inheritDoc}
*/
@Override
protected void onCreate(Bundle state) {
if (DEBUG) {
Log.d(TAG, "ShortcutActivity.onCreate"); //$NON-NLS-1$
}
// Register the broadcast receiver
IntentFilter filter = new IntentFilter();
filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED);
registerReceiver(this.mNotificationReceiver, filter);
//Save state
super.onCreate(state);
init();
}
/**
* {@inheritDoc}
*/
@Override
protected void onDestroy() {
if (DEBUG) {
Log.d(TAG, "ShortcutActivity.onDestroy"); //$NON-NLS-1$
}
// Unregister the receiver
try {
unregisterReceiver(this.mNotificationReceiver);
} catch (Throwable ex) {
/**NON BLOCK**/
}
//All destroy. Continue
super.onDestroy();
}
/**
* Initialize the activity. This method handles the passed intent, opens
* the appropriate activity and ends.
*/
private void init() {
try {
String type = getIntent().getStringExtra(EXTRA_TYPE);
String path = getIntent().getStringExtra(EXTRA_FSO);
// Check that i have a valid information
if (type == null || type.length() == 0 || path == null || path.length() == 0) {
// Something is wrong
Log.w(TAG,
String.format(
"The shortcut intent couldn't be handled. Intent: %s", //$NON-NLS-1$
getIntent()));
DialogHelper.showToast(this, R.string.shortcut_failed_msg, Toast.LENGTH_SHORT);
finish();
return;
}
if (type.compareTo(SHORTCUT_TYPE_NAVIGATE) != 0 &&
type.compareTo(SHORTCUT_TYPE_OPEN) != 0) {
// Something is wrong
Log.w(TAG,
String.format(
"The shortcut intent type is unknown: %s", type)); //$NON-NLS-1$
DialogHelper.showToast(this, R.string.shortcut_failed_msg, Toast.LENGTH_SHORT);
finish();
return;
}
// Initializes the console
initializeConsole();
// Retrieve the fso
FileSystemObject fso =
CommandHelper.getFileInfo(getApplicationContext(), path, true, null);
if (fso == null) {
// Something is wrong
Log.w(TAG,
String.format(
"The fso not exists: %s", path)); //$NON-NLS-1$
DialogHelper.showToast(this, R.string.shortcut_failed_msg, Toast.LENGTH_SHORT);
finish();
return;
}
// Check what type of shortcut is registered and apply the best action
if (type.compareTo(SHORTCUT_TYPE_NAVIGATE) == 0) {
// We have to finish here; this activity is only a wrapper
finish();
// Forward to the NavigationActivity
Intent intent = new Intent(this, NavigationActivity.class);
intent.putExtra(NavigationActivity.EXTRA_NAVIGATE_TO, fso.getFullPath());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
} else {
// Open the file. Delegate in action policy
IntentsActionPolicy.openFileSystemObject(this, fso, false, this, this);
}
} catch (Exception e) {
Log.e(TAG, "Failed to handle the shortcut intent.", e); //$NON-NLS-1$
DialogHelper.showToast(this, R.string.shortcut_failed_msg, Toast.LENGTH_SHORT);
finish();
}
}
/**
* Method that initializes a console
*/
private boolean initializeConsole() {
try {
// Is there a console allocate
if (!ConsoleBuilder.isAlloc()) {
// Create a console
ConsoleBuilder.getConsole(this);
}
// There is a console allocated. Use it.
return true;
} catch (Throwable _throw) {
// Capture the exception
ExceptionUtil.translateException(this, _throw, true, false);
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public void onDismiss(DialogInterface dialog) {
// We have to finish here; this activity is only a wrapper
finish();
}
/**
* {@inheritDoc}
*/
@Override
public void onCancel(DialogInterface dialog) {
// We have to finish here; this activity is only a wrapper
finish();
}
/**
* Method that applies the current theme to the activity
* @hide
*/
void applyTheme() {
Theme theme = ThemeManager.getCurrentTheme(this);
theme.setBaseTheme(this, true);
}
}