org.androidsoft.app.permission.ui.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.androidsoft.app.permission.ui.MainActivity.java

Source

/* Copyright (c) 2010-2012 Pierre LEVY androidsoft.org
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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 org.androidsoft.app.permission.ui;

import android.app.AlertDialog;
import android.content.DialogInterface;
import org.androidsoft.app.permission.service.ApplicationChangesListener;
import org.androidsoft.app.permission.service.PermissionService;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import org.androidsoft.app.permission.R;
import org.androidsoft.app.permission.model.AppInfo;
import org.androidsoft.app.permission.service.ApplicationChangesService;

/**
 * Main Activity
 *
 * @author Pierre Levy
 */
public class MainActivity extends FragmentActivity
        implements ApplicationsListFragment.AppListEventsCallback, OnClickListener, ApplicationChangesListener {

    public static String EXTRA_PACKAGE_NAME = "packageName";
    private static final String KEY_SORT = "sort";
    private static final String KEY_TOGGLE_NAME = "toggle_name";
    private static final String KEY_TOGGLE_SCORE = "toggle_score";
    private static final String KEY_SHOW_TRUSTED = "show_trusted";
    private static final String KEY_FILTER_ENABLED = "filter_enabled";
    private static final String KEY_FILTER_VALUE = "filter_value";

    private static final int SORT_SCORE = 0;
    private static final int SORT_NAME = 1;

    private TextView mButtonSortByName;
    private TextView mButtonSortByScore;
    private ImageView mButtonShowTrusted;
    private ImageView mButtonFilter;
    private View mLayoutFilter;
    private TextView mTvFilter;
    private View mIndicatorName;
    private View mIndicatorScore;
    private View mIndicatorTrusted;
    private View mIndicatorFilter;
    private ApplicationsListFragment mApplicationsListFragment;
    private boolean mToggleName = true;
    private boolean mToggleScore = false;
    private boolean mShowTrusted;
    private boolean mFilterEnabled;
    private String mFilterValue;
    private int mSort;
    private boolean mInvalidate;
    private String mPackageName;

    /**
     * {@inheritDoc }
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }

        setContentView(R.layout.main);

        mButtonSortByName = (TextView) findViewById(R.id.button_sort_name);
        mButtonSortByName.setOnClickListener(this);

        mButtonSortByScore = (TextView) findViewById(R.id.button_sort_score);
        mButtonSortByScore.setOnClickListener(this);

        mButtonShowTrusted = (ImageView) findViewById(R.id.button_show_trusted);
        mButtonShowTrusted.setOnClickListener(this);

        mButtonFilter = (ImageView) findViewById(R.id.button_filter);
        mButtonFilter.setOnClickListener(this);

        mTvFilter = (TextView) findViewById(R.id.label_filter);
        mLayoutFilter = findViewById(R.id.label_filter);
        mLayoutFilter.setOnClickListener(this);

        mIndicatorName = findViewById(R.id.indicator_name);
        mIndicatorScore = findViewById(R.id.indicator_score);
        mIndicatorTrusted = findViewById(R.id.indicator_trusted);
        mIndicatorFilter = findViewById(R.id.indicator_filter);

        FragmentManager fm = getSupportFragmentManager();
        mApplicationsListFragment = (ApplicationsListFragment) fm.findFragmentById(R.id.fragment_applications_list);

        ApplicationChangesService.registerListener(this);
        mInvalidate = true;
    }

    /**
     * {@inheritDoc }
     */
    public void onAppSelected(String packageName) {
        mPackageName = packageName;
        FragmentManager fm = getSupportFragmentManager();
        ApplicationFragment applicationFragment = (ApplicationFragment) fm
                .findFragmentById(R.id.fragment_application_details);
        if (applicationFragment != null) {
            applicationFragment.updateApplication(this, packageName);
        } else {
            Intent intent = new Intent(this, ApplicationActivity.class);
            intent.putExtra(EXTRA_PACKAGE_NAME, packageName);
            startActivity(intent);
        }
    }

    /**
     * {@inheritDoc }
     */
    public void onApplicationChange() {
        refreshAppList();
        mInvalidate = true;
    }

    /**
     * {@inheritDoc }
     */
    public void onClick(View view) {
        if (view == mButtonSortByName) {
            sortByName();
        } else if (view == mButtonSortByScore) {
            sortByScore();
        } else if (view == mButtonShowTrusted) {
            toggleShowTrusted();
        } else if (view == mButtonFilter) {
            toggleFilter();
        } else if (view == mLayoutFilter) {
            updateFilter();
        }
    }

    /**
     * {@inheritDoc }
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return true;
    }

    /**
     * {@inheritDoc }
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_help:
            help();
            return true;
        case R.id.menu_credits:
            credits();
            return true;
        }
        return false;
    }

    @Override
    protected void onPause() {
        super.onPause();
        SharedPreferences prefs = getPreferences(MODE_PRIVATE);
        Editor editor = prefs.edit();
        editor.putInt(KEY_SORT, mSort);
        editor.putBoolean(KEY_TOGGLE_NAME, mToggleName);
        editor.putBoolean(KEY_TOGGLE_SCORE, mToggleScore);
        editor.putBoolean(KEY_SHOW_TRUSTED, mShowTrusted);
        editor.putBoolean(KEY_FILTER_ENABLED, mFilterEnabled);
        editor.putString(KEY_FILTER_VALUE, mFilterValue);
        editor.commit();
    }

    @Override
    protected void onResume() {
        super.onResume();
        SharedPreferences prefs = getPreferences(MODE_PRIVATE);
        mSort = prefs.getInt(KEY_SORT, SORT_SCORE);
        mToggleName = prefs.getBoolean(KEY_TOGGLE_NAME, false);
        mToggleScore = prefs.getBoolean(KEY_TOGGLE_SCORE, false);
        mShowTrusted = prefs.getBoolean(KEY_SHOW_TRUSTED, true);
        mFilterEnabled = prefs.getBoolean(KEY_FILTER_ENABLED, false);
        mFilterValue = prefs.getString(KEY_FILTER_VALUE, null);
        if (mInvalidate) {
            updateUI();
            refreshApplicationFragment();
            mInvalidate = false;
        }
        refreshIndicators();
    }

    private void refreshAppList() {
        new LoadingTask().execute();
    }

    private void refreshApplicationFragment() {
        FragmentManager fm = getSupportFragmentManager();
        ApplicationFragment applicationFragment = (ApplicationFragment) fm
                .findFragmentById(R.id.fragment_application_details);
        if (applicationFragment != null) {
            applicationFragment.updateApplication(this, mPackageName);
        }
    }

    private void help() {
        Intent intent = new Intent(this, HelpActivity.class);
        startActivity(intent);
    }

    private void credits() {
        Intent intent = new Intent(this, CreditsActivity.class);
        startActivity(intent);
    }

    private void sortByName() {
        mToggleName = !mToggleName;
        mSort = SORT_NAME;
        updateUI();
    }

    private void sortByScore() {
        mToggleScore = !mToggleScore;
        mSort = SORT_SCORE;
        updateUI();
    }

    private void toggleShowTrusted() {
        mShowTrusted = !mShowTrusted;
        updateUI();
    }

    private void updateUI() {
        refreshAppList();
        refreshIndicators();
    }

    private void update(List<AppInfo> list) {
        mApplicationsListFragment.update(list);
    }

    private List<AppInfo> getApplicationsList() {
        switch (mSort) {
        case SORT_NAME:
            return PermissionService.getApplicationsSortedByName(this, mToggleName, mShowTrusted, mFilterValue);

        case SORT_SCORE:
        default:
            return PermissionService.getApplicationsSortedByScore(this, mToggleScore, mShowTrusted, mFilterValue);
        }
    }

    private void refreshIndicators() {
        if (mSort == SORT_SCORE) {
            mIndicatorScore.setBackgroundResource(R.drawable.bar_on);
            mIndicatorName.setBackgroundResource(R.drawable.bar_off);
        } else {
            mIndicatorScore.setBackgroundResource(R.drawable.bar_off);
            mIndicatorName.setBackgroundResource(R.drawable.bar_on);
        }

        if (mShowTrusted) {
            mIndicatorTrusted.setBackgroundResource(R.drawable.bar_on);
        } else {
            mIndicatorTrusted.setBackgroundResource(R.drawable.bar_off);
        }

        if (mFilterEnabled) {
            mLayoutFilter.setVisibility(View.VISIBLE);
            mIndicatorFilter.setBackgroundResource(R.drawable.bar_on);
            mTvFilter.setText(mFilterValue);

        } else {
            mLayoutFilter.setVisibility(View.GONE);
            mIndicatorFilter.setBackgroundResource(R.drawable.bar_off);
        }
    }

    private void toggleFilter() {
        mFilterEnabled = !mFilterEnabled;

        if (mFilterEnabled) {
            updateFilter();
        } else {
            mFilterValue = null;
            updateUI();
        }
    }

    private void updateFilter() {
        final String[] items = PermissionService.getPermissions();
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(getString(R.string.dialog_title_select_permission));
        builder.setItems(items, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int item) {
                mFilterValue = items[item];
                updateUI();
            }
        });

        AlertDialog alert = builder.create();

        alert.show();

    }

    private class LoadingTask extends AsyncTask<Void, Void, Void> {

        private List<AppInfo> mList;

        @Override
        protected Void doInBackground(Void... arg0) {
            mList = getApplicationsList();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            update(mList);
        }
    }
}