2 * Copyright (C) 2013 Koushik Dutta (@koush)
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.koushikdutta.superuser;
19 import java.util.ArrayList;
20 import java.util.Date;
22 import android.content.Context;
23 import android.content.res.Configuration;
24 import android.database.sqlite.SQLiteDatabase;
25 import android.graphics.drawable.Drawable;
26 import android.os.Bundle;
27 import android.support.v4.app.FragmentActivity;
28 import android.text.format.DateFormat;
29 import android.util.TypedValue;
30 import android.view.ContextThemeWrapper;
31 import android.view.Menu;
32 import android.view.MenuInflater;
33 import android.view.MenuItem;
34 import android.view.MenuItem.OnMenuItemClickListener;
35 import android.view.View;
36 import android.widget.ImageView;
38 import com.koushikdutta.superuser.db.LogEntry;
39 import com.koushikdutta.superuser.db.SuDatabaseHelper;
40 import com.koushikdutta.superuser.db.SuperuserDatabaseHelper;
41 import com.koushikdutta.superuser.db.UidPolicy;
42 import com.koushikdutta.widgets.FragmentInterfaceWrapper;
43 import com.koushikdutta.widgets.ListContentFragmentInternal;
44 import com.koushikdutta.widgets.ListItem;
46 public class PolicyFragmentInternal extends ListContentFragmentInternal {
47 public PolicyFragmentInternal(FragmentInterfaceWrapper fragment) {
51 ContextThemeWrapper mWrapper;
53 public Context getContext() {
56 TypedValue value = new TypedValue();
57 super.getContext().getTheme().resolveAttribute(R.attr.largeIconTheme, value, true);
58 mWrapper = new ContextThemeWrapper(super.getContext(), value.resourceId);
63 setContent(null, null);
64 getListView().clearChoices();
69 final ArrayList<UidPolicy> policies = SuDatabaseHelper.getPolicies(getActivity());
71 SQLiteDatabase db = new SuperuserDatabaseHelper(getActivity()).getReadableDatabase();
73 for (UidPolicy up: policies) {
75 ArrayList<LogEntry> logs = SuperuserDatabaseHelper.getLogs(db, up, 1);
77 last = logs.get(0).date;
86 public void onResume() {
91 FragmentInterfaceWrapper mContent;
95 public void onCreate(Bundle savedInstanceState, View view) {
96 super.onCreate(savedInstanceState, view);
98 getFragment().setHasOptionsMenu(true);
100 setEmpty(R.string.no_apps);
104 if ("com.koushikdutta.superuser".equals(getContext().getPackageName())) {
105 ImageView watermark = (ImageView)view.findViewById(R.id.watermark);
106 if (watermark != null)
107 watermark.setImageResource(R.drawable.clockwork512);
113 public Date getLastDate(int last) {
114 return new Date((long)last * 1000);
117 void addPolicy(final UidPolicy up, final int last) {
118 java.text.DateFormat df = DateFormat.getLongDateFormat(getActivity());
123 date = df.format(getLastDate(last));
124 ListItem li = addItem(up.getPolicyResource(), new ListItem(this, up.name, date) {
125 public void onClick(View view) {
128 setContent(this, up);
132 Drawable icon = Helper.loadPackageIcon(getActivity(), up.packageName);
134 li.setIcon(R.drawable.ic_launcher);
136 li.setDrawable(icon);
139 public void onConfigurationChanged(Configuration newConfig) {
142 protected LogNativeFragment createLogNativeFragment() {
143 return new LogNativeFragment();
146 protected SettingsNativeFragment createSettingsNativeFragment() {
147 return new SettingsNativeFragment();
150 FragmentInterfaceWrapper setContentNative(final ListItem li, final UidPolicy up) {
151 LogNativeFragment l = createLogNativeFragment();
152 l.getInternal().setUidPolicy(up);
154 Bundle args = new Bundle();
155 args.putString("command", up.command);
156 args.putInt("uid", up.uid);
157 args.putInt("desiredUid", up.desiredUid);
158 l.setArguments(args);
160 l.getInternal().setListContentId(getFragment().getId());
164 void setContent(final ListItem li, final UidPolicy up) {
165 if (getActivity() instanceof FragmentActivity) {
166 LogFragment l = new LogFragment();
167 l.getInternal().setUidPolicy(up);
168 l.getInternal().setListContentId(getFragment().getId());
172 mContent = setContentNative(li, up);
175 setContent(mContent, up == null, up == null ? getString(R.string.logs) : up.getName());
180 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
181 super.onCreateOptionsMenu(menu, inflater);
182 MenuInflater mi = new MenuInflater(getActivity());
183 mi.inflate(R.menu.main, menu);
184 MenuItem log = menu.findItem(R.id.logs);
185 log.setOnMenuItemClickListener(new OnMenuItemClickListener() {
187 public boolean onMenuItemClick(MenuItem item) {
193 MenuItem settings = menu.findItem(R.id.settings);
194 settings.setOnMenuItemClickListener(new OnMenuItemClickListener() {
195 void openSettingsNative(final MenuItem item) {
196 setContent(createSettingsNativeFragment(), true, getString(R.string.settings));
200 public boolean onMenuItemClick(final MenuItem item) {
201 if (getActivity() instanceof FragmentActivity) {
202 setContent(new SettingsFragment(), true, getString(R.string.settings));
205 openSettingsNative(item);