OSDN Git Service

Add MIPS support
[android-x86/external-koush-Superuser.git] / Superuser / src / com / koushikdutta / superuser / PolicyFragmentInternal.java
1 /*
2  * Copyright (C) 2013 Koushik Dutta (@koush)
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package com.koushikdutta.superuser;
18
19 import java.util.ArrayList;
20 import java.util.Date;
21
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;
37
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;
45
46 public class PolicyFragmentInternal extends ListContentFragmentInternal {
47     public PolicyFragmentInternal(FragmentInterfaceWrapper fragment) {
48         super(fragment);
49     }
50     
51     ContextThemeWrapper mWrapper;
52     @Override
53     public Context getContext() {
54         if (mWrapper != null)
55             return mWrapper;
56         TypedValue value = new TypedValue();
57         super.getContext().getTheme().resolveAttribute(R.attr.largeIconTheme, value, true);
58         mWrapper = new ContextThemeWrapper(super.getContext(), value.resourceId);
59         return mWrapper;
60     }
61     
62     void showAllLogs() {
63         setContent(null, null);
64         getListView().clearChoices();
65     }
66     
67     void load() {
68         clear();
69         final ArrayList<UidPolicy> policies = SuDatabaseHelper.getPolicies(getActivity());
70         
71         SQLiteDatabase db = new SuperuserDatabaseHelper(getActivity()).getReadableDatabase(); 
72         try {
73             for (UidPolicy up: policies) {
74                 int last = 0;
75                 ArrayList<LogEntry> logs = SuperuserDatabaseHelper.getLogs(db, up, 1);
76                 if (logs.size() > 0)
77                     last = logs.get(0).date;
78                 addPolicy(up, last);
79             }
80         }
81         finally {
82             db.close();
83         }
84     }
85     
86     public void onResume() {
87         super.onResume();
88         load();
89     }
90
91     FragmentInterfaceWrapper mContent;
92
93     
94     @Override
95     public void onCreate(Bundle savedInstanceState, View view) {
96         super.onCreate(savedInstanceState, view);
97
98         getFragment().setHasOptionsMenu(true);
99         
100         setEmpty(R.string.no_apps);
101         
102         load();
103
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);
108         }
109         if (!isPaged())
110             showAllLogs();
111     }
112     
113     public Date getLastDate(int last) {
114         return new Date((long)last * 1000);
115     }
116
117     void addPolicy(final UidPolicy up, final int last) {
118         java.text.DateFormat df = DateFormat.getLongDateFormat(getActivity());
119         String date;
120         if (last == 0)
121             date = null;
122         else
123             date = df.format(getLastDate(last));
124         ListItem li = addItem(up.getPolicyResource(), new ListItem(this, up.name, date) {
125             public void onClick(View view) {
126                 super.onClick(view);
127
128                 setContent(this, up);
129             };
130         });
131         
132         Drawable icon = Helper.loadPackageIcon(getActivity(), up.packageName);
133         if (icon == null)
134             li.setIcon(R.drawable.ic_launcher);
135         else
136             li.setDrawable(icon);
137     }
138     
139     public void onConfigurationChanged(Configuration newConfig) {
140     };
141
142     protected LogNativeFragment createLogNativeFragment() {
143         return new LogNativeFragment();
144     }
145     
146     protected SettingsNativeFragment createSettingsNativeFragment() {
147         return new SettingsNativeFragment();
148     }
149
150     FragmentInterfaceWrapper setContentNative(final ListItem li, final UidPolicy up) {
151         LogNativeFragment l = createLogNativeFragment();
152         l.getInternal().setUidPolicy(up);
153         if (up != null) {
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);
159         }
160         l.getInternal().setListContentId(getFragment().getId());
161         return l;
162     }
163     
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());
169             mContent = l;
170         }
171         else {
172             mContent = setContentNative(li, up);
173         }
174         
175         setContent(mContent, up == null, up == null ? getString(R.string.logs) : up.getName());
176     }
177
178     
179     @Override
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() {
186             @Override
187             public boolean onMenuItemClick(MenuItem item) {
188                 showAllLogs();
189                 return true;
190             }
191         });
192         
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));
197             }
198             
199             @Override
200             public boolean onMenuItemClick(final MenuItem item) {
201                 if (getActivity() instanceof FragmentActivity) {
202                     setContent(new SettingsFragment(), true, getString(R.string.settings));
203                 }
204                 else {
205                     openSettingsNative(item);
206                 }
207                 return true;
208             }
209         });
210     }
211
212 }