/*
 * Copyright (C) 2011 The Android Open Source 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.android.exchange;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import com.android.emailcommon.utility.IntentUtilities;

/**
 * An empty {@link Activity} that simply redirects to the proper settings editor for the Email
 * application.
 * This is needed since the Exchange service runs as a separate UID and is therefore tracked as
 * a separate entity in the framework for things such as data usage. Links from those places to
 * Exchange should really go to Email where the real settings are.
 */
public class SettingsRedirector extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent redirect = new Intent(
                Intent.ACTION_EDIT,
                IntentUtilities.createActivityIntentUrlBuilder(IntentUtilities.PATH_SETTINGS)
                        .build());
        redirect.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        try {
            startActivity(redirect);
        } catch (ActivityNotFoundException e) {
            Toast toast = Toast.makeText(this, R.string.email_settings_not_available,
                    Toast.LENGTH_SHORT);
            toast.show();
        }
        finish();
    }
}
