Test Applications Demonstrating Push API
Applications that demonstrate the usage of Push API. Change-Id: I4a2ace230d7ac7f699c998c0df96cf95f2e85a85
This commit is contained in:
18
apps/PushApiAuthenticator/Android.mk
Normal file
18
apps/PushApiAuthenticator/Android.mk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
# Only compile source java files in this apk.
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := PushApiAuthenticator
|
||||||
|
|
||||||
|
LOCAL_SDK_VERSION := current
|
||||||
|
|
||||||
|
LOCAL_DEX_PREOPT := false
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
|
||||||
|
# Use the following include to make our test apk.
|
||||||
|
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||||
41
apps/PushApiAuthenticator/AndroidManifest.xml
Normal file
41
apps/PushApiAuthenticator/AndroidManifest.xml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.example.android.pushapiauthenticator">
|
||||||
|
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
|
||||||
|
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
|
||||||
|
<application android:label="Auth Tester" android:icon="@drawable/push">
|
||||||
|
<activity android:name="MainActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<service
|
||||||
|
android:name=".MyAccountAuthenticatorService"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action
|
||||||
|
android:name="android.accounts.AccountAuthenticator" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.accounts.AccountAuthenticator"
|
||||||
|
android:resource="@xml/authenticator" />
|
||||||
|
</service>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
BIN
apps/PushApiAuthenticator/res/drawable/push.png
Normal file
BIN
apps/PushApiAuthenticator/res/drawable/push.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
246
apps/PushApiAuthenticator/res/layout/activity_main.xml
Normal file
246
apps/PushApiAuthenticator/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#EE6161"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:fillViewport="false">
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
|
android:paddingTop="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="All Requesting 3Ps"
|
||||||
|
android:id="@+id/textView7"
|
||||||
|
android:layout_below="@+id/textView3"
|
||||||
|
android:layout_alignLeft="@+id/textView8"
|
||||||
|
android:layout_alignStart="@+id/textView8"
|
||||||
|
android:layout_marginTop="24dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:text="UIDs"
|
||||||
|
android:id="@+id/textView8"
|
||||||
|
android:layout_below="@+id/textView7"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:text="Packages"
|
||||||
|
android:id="@+id/textView9"
|
||||||
|
android:layout_below="@+id/uidsrequestingapps"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_marginTop="63dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="-----"
|
||||||
|
android:id="@+id/uidsrequestingapps"
|
||||||
|
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_below="@+id/textView8"
|
||||||
|
android:layout_toRightOf="@+id/authenticatorstatus" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="-----"
|
||||||
|
android:id="@+id/packagesrequestingapps"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_below="@+id/textView9"
|
||||||
|
android:layout_alignRight="@+id/textView11" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
style="?android:attr/buttonStyleSmall"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="GET!"
|
||||||
|
android:id="@+id/getallrequestingapps"
|
||||||
|
android:layout_alignTop="@+id/textView7"
|
||||||
|
android:layout_toRightOf="@+id/textView3"
|
||||||
|
android:layout_toEndOf="@+id/textView3" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Choose Account"
|
||||||
|
android:id="@+id/textView10"
|
||||||
|
android:layout_marginTop="57dp"
|
||||||
|
android:layout_below="@+id/packagesrequestingapps"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<RadioGroup
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="120dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:id="@+id/accountGroup"
|
||||||
|
android:layout_below="@+id/textView10"
|
||||||
|
android:layout_alignParentLeft="true">
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="TERRA"
|
||||||
|
android:id="@+id/terrabutton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="AQUA"
|
||||||
|
android:id="@+id/aquabutton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="VENTUS"
|
||||||
|
android:id="@+id/ventusbutton"
|
||||||
|
android:checked="false" />
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Options"
|
||||||
|
android:id="@+id/textView11"
|
||||||
|
android:layout_below="@+id/accountGroup"
|
||||||
|
android:layout_alignParentLeft="true" />
|
||||||
|
|
||||||
|
<RadioGroup
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="220dp"
|
||||||
|
android:id="@+id/optionsGroup"
|
||||||
|
android:layout_below="@+id/textView11"
|
||||||
|
android:layout_alignParentLeft="true">
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="ADD VISIBILITY"
|
||||||
|
android:id="@+id/addButton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="REMOVE VISIBILITY"
|
||||||
|
android:id="@+id/removeButton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="GET VISIBILITY"
|
||||||
|
android:id="@+id/getButton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="ADD ACCOUNT (Normal)"
|
||||||
|
android:id="@+id/addAccountButton"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="ADD ACCOUNT EXPLICITLY w/ UID"
|
||||||
|
android:id="@+id/addAccountButtonWithUid"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="REMOVE ACCOUNT"
|
||||||
|
android:id="@+id/removeAccount"
|
||||||
|
android:checked="false" />
|
||||||
|
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:layout_marginTop="100dp"
|
||||||
|
style="?android:attr/buttonStyleSmall"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Go!"
|
||||||
|
android:id="@+id/selectoptionbutton"
|
||||||
|
android:layout_below="@+id/optionsGroup"
|
||||||
|
android:layout_alignParentLeft="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="STATUS:"
|
||||||
|
android:id="@+id/textView12"
|
||||||
|
android:layout_below="@+id/selectoptionbutton"
|
||||||
|
android:layout_alignParentLeft="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="----"
|
||||||
|
android:id="@+id/authenticatorstatus"
|
||||||
|
android:layout_below="@+id/textView12"
|
||||||
|
android:layout_alignParentLeft="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Authenticator Application"
|
||||||
|
android:id="@+id/textView3"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_centerHorizontal="true" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/uidchooser"
|
||||||
|
android:layout_below="@+id/optionsGroup"
|
||||||
|
android:layout_alignRight="@+id/getallrequestingapps"
|
||||||
|
android:layout_alignEnd="@+id/getallrequestingapps"
|
||||||
|
android:layout_marginTop="28dp" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="key1"
|
||||||
|
android:title="Sign-in & latitude">
|
||||||
|
<intent android:action="com.google.android.apps.maps.LOCATION_SETTINGS" />
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="key3"
|
||||||
|
android:title="Sign-in & security">
|
||||||
|
<intent android:action="com.google.android.gms.accountsettings.SECURITY_SETTINGS" />
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="key8"
|
||||||
|
android:title="Sign-in & security">
|
||||||
|
<intent android:action="com.google.android.gms.accountsettings.PRIVACY_SETTINGS" />
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="key9"
|
||||||
|
android:title="Sign-in & security">
|
||||||
|
<intent android:action=
|
||||||
|
"com.google.android.gms.accountsettings.ACCOUNT_PREFERENCES_SETTINGS" />
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
||||||
25
apps/PushApiAuthenticator/res/xml/authenticator.xml
Normal file
25
apps/PushApiAuthenticator/res/xml/authenticator.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:accountType="com.example.android.pushapiauthenticator"
|
||||||
|
android:icon="@drawable/push"
|
||||||
|
android:smallIcon="@drawable/push"
|
||||||
|
android:label="This is a label"
|
||||||
|
android:customTokens="true"
|
||||||
|
android:accountPreferences="@xml/auth_account_preferences"
|
||||||
|
/>
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapiauthenticator;
|
||||||
|
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.accounts.AccountManager;
|
||||||
|
import android.accounts.AccountManagerCallback;
|
||||||
|
import android.accounts.AccountManagerFuture;
|
||||||
|
import android.accounts.AuthenticatorDescription;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.RadioButton;
|
||||||
|
import android.widget.RadioGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
|
||||||
|
private static AccountManager am;
|
||||||
|
|
||||||
|
public boolean isAccountAdded(Account a) {
|
||||||
|
Account[] accounts = am.getAccountsByType(getApplicationContext().getPackageName());
|
||||||
|
for (Account account : accounts) {
|
||||||
|
if (a.equals(account)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
am = AccountManager.get(getApplicationContext());
|
||||||
|
final Button getAllRequestingApps = (Button) findViewById(R.id.getallrequestingapps);
|
||||||
|
final TextView getAllRequesting3pUids = (TextView) findViewById(R.id.uidsrequestingapps);
|
||||||
|
final TextView getAllRequesting3pPackages =
|
||||||
|
(TextView) findViewById(R.id.packagesrequestingapps);
|
||||||
|
|
||||||
|
final RadioGroup accountChooser = (RadioGroup) findViewById(R.id.accountGroup);
|
||||||
|
final RadioGroup optionChooser = (RadioGroup) findViewById(R.id.optionsGroup);
|
||||||
|
final EditText uidChooser = (EditText) findViewById(R.id.uidchooser);
|
||||||
|
final Button selectOption = (Button) findViewById(R.id.selectoptionbutton);
|
||||||
|
final TextView authStatus = (TextView) findViewById(R.id.authenticatorstatus);
|
||||||
|
|
||||||
|
final Toast hitGet = Toast.makeText(getApplicationContext(),
|
||||||
|
"Hit the GET Button!", Toast.LENGTH_SHORT);
|
||||||
|
final Toast enterUidWarning = Toast.makeText(getApplicationContext(),
|
||||||
|
"Enter a UID!", Toast.LENGTH_SHORT);
|
||||||
|
final Toast chooseAccountWarning = Toast.makeText(getApplicationContext(),
|
||||||
|
"Choose an Account!", Toast.LENGTH_SHORT);
|
||||||
|
final Toast chooseOptionWarning = Toast.makeText(getApplicationContext(),
|
||||||
|
"Choose an Option!", Toast.LENGTH_SHORT);
|
||||||
|
|
||||||
|
final String ACCOUNT_PASSWORD = "some password";
|
||||||
|
final Bundle ACCOUNT_BUNDLE = new Bundle();
|
||||||
|
|
||||||
|
Account terraAccount = new Account("TERRA", getPackageName());
|
||||||
|
Account aquaAccount = new Account("AQUA", getPackageName());
|
||||||
|
Account ventusAccount = new Account("VENTUS", getPackageName());
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setMessage("Welcome to Auth App. \nPlease make sure you have: \n\n1. Test App 1\n"
|
||||||
|
+"\n2. Test App 2 \n\ninstalled for the demo. These applications" +
|
||||||
|
" together provide tests, use cases, and proof of concept of Push API!\n")
|
||||||
|
.setTitle("WELCOME")
|
||||||
|
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
getAllRequestingApps.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
int[] allRequestedUids = am.getRequestingUidsForType(getApplicationContext()
|
||||||
|
.getPackageName());
|
||||||
|
if (allRequestedUids != null) {
|
||||||
|
StringBuilder uidMasterString = new StringBuilder();
|
||||||
|
StringBuilder packageMasterString = new StringBuilder();
|
||||||
|
for (int i = 0 ; i < allRequestedUids.length ; i++) {
|
||||||
|
uidMasterString.append(allRequestedUids[i] + ",\n\n");
|
||||||
|
packageMasterString.append(getPackageManager().
|
||||||
|
getNameForUid(allRequestedUids[i])
|
||||||
|
+ ",\n\n");
|
||||||
|
}
|
||||||
|
if (uidMasterString.length() > 0) {
|
||||||
|
getAllRequesting3pUids.setText(uidMasterString);
|
||||||
|
} else {
|
||||||
|
getAllRequesting3pUids.setText("----");
|
||||||
|
}
|
||||||
|
if (packageMasterString.length() > 0) {
|
||||||
|
getAllRequesting3pPackages.setText(packageMasterString);
|
||||||
|
} else {
|
||||||
|
getAllRequesting3pPackages.setText("----");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
getAllRequesting3pPackages.setText("----");
|
||||||
|
getAllRequesting3pUids.setText("----");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
selectOption.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Account currentAccount = terraAccount;
|
||||||
|
int checkedAccount = accountChooser.getCheckedRadioButtonId();
|
||||||
|
int checkedOption = optionChooser.getCheckedRadioButtonId();
|
||||||
|
if (uidChooser.getText().length() == 0) {
|
||||||
|
enterUidWarning.show();
|
||||||
|
} else if (checkedAccount == -1) {
|
||||||
|
chooseAccountWarning.show();
|
||||||
|
} else if (checkedOption == -1) {
|
||||||
|
chooseOptionWarning.show();
|
||||||
|
} else {
|
||||||
|
//all conditions satisfied
|
||||||
|
if (checkedAccount == R.id.terrabutton) {
|
||||||
|
currentAccount = terraAccount;
|
||||||
|
} else if (checkedAccount == R.id.aquabutton) {
|
||||||
|
currentAccount = aquaAccount;
|
||||||
|
} else if (checkedAccount == R.id.ventusbutton) {
|
||||||
|
currentAccount = ventusAccount;
|
||||||
|
}
|
||||||
|
String uidstr = uidChooser.getText().toString();
|
||||||
|
int uid = Integer.parseInt(uidstr);
|
||||||
|
if (checkedOption == R.id.addButton) {
|
||||||
|
am.makeAccountVisible(currentAccount, uid);
|
||||||
|
Toast.makeText(getApplicationContext(), "Giving Visibility of " +
|
||||||
|
currentAccount.name + " to " +
|
||||||
|
getPackageManager().getNameForUid(uid),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
} else if (checkedOption == R.id.removeButton) {
|
||||||
|
am.removeAccountVisibility(currentAccount, uid);
|
||||||
|
Toast.makeText(getApplicationContext(), "Removing Visibility of " +
|
||||||
|
currentAccount.name + " to " +
|
||||||
|
getPackageManager().getNameForUid(uid),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
|
||||||
|
} else if (checkedOption == R.id.getButton) {
|
||||||
|
Toast.makeText(getApplicationContext(), "Is " + currentAccount.name +
|
||||||
|
" visible to " + getPackageManager().getNameForUid(uid) + "?\n" +
|
||||||
|
am.isAccountVisible(currentAccount, uid), Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
} else if (checkedOption == R.id.addAccountButton) {
|
||||||
|
Toast.makeText(getApplicationContext(), "Adding account explicitly!"
|
||||||
|
+ am.addAccountExplicitly(currentAccount, null, null),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
} else if (checkedOption == R.id.addAccountButtonWithUid) {
|
||||||
|
int[] uidsToAdd = new int[] {uid};
|
||||||
|
Toast.makeText(getApplicationContext(), "Adding account explicitly!"
|
||||||
|
+ am.addAccountExplicitly(currentAccount, null, null, uidsToAdd)
|
||||||
|
+ " TO: " + getPackageManager().getNameForUid(uid) + "!",
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
} else if (checkedOption == R.id.removeAccount) {
|
||||||
|
Toast.makeText(getApplicationContext(), "Removing account explicitly!"
|
||||||
|
+ am.removeAccountExplicitly(currentAccount),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
StringBuilder masterString = new StringBuilder();
|
||||||
|
String uidMasterString = getAllRequesting3pUids.getText().toString();
|
||||||
|
int[] allUids = am.getRequestingUidsForType(getApplicationContext().
|
||||||
|
getPackageName());
|
||||||
|
if (allUids != null) {
|
||||||
|
for (int i = 0 ; i < allUids.length ; i++) {
|
||||||
|
masterString.append(allUids[i] + "\n");
|
||||||
|
if (am.isAccountVisible(terraAccount, allUids[i])) {
|
||||||
|
masterString.append(terraAccount.name + ",");
|
||||||
|
}
|
||||||
|
if (am.isAccountVisible(aquaAccount, allUids[i])) {
|
||||||
|
masterString.append(aquaAccount.name + ",");
|
||||||
|
}
|
||||||
|
if (am.isAccountVisible(ventusAccount, allUids[i])) {
|
||||||
|
masterString.append(ventusAccount.name);
|
||||||
|
}
|
||||||
|
masterString.append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (masterString.length() > 0) {
|
||||||
|
authStatus.setText(masterString);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
authStatus.setText("----");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapiauthenticator;
|
||||||
|
|
||||||
|
import android.accounts.AbstractAccountAuthenticator;
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.accounts.AccountAuthenticatorResponse;
|
||||||
|
import android.accounts.AccountManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
public class MyAccountAuthenticator extends AbstractAccountAuthenticator {
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
public MyAccountAuthenticator(Context context) {
|
||||||
|
super(context);
|
||||||
|
mContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
|
||||||
|
String authTokenType, String[] requiredFeatures, Bundle options) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
|
||||||
|
String authTokenType, Bundle options) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
|
||||||
|
Bundle options) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthTokenLabel(String authTokenType) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
|
||||||
|
String[] features) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
|
||||||
|
String authTokenType, Bundle options) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapiauthenticator;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
|
||||||
|
public class MyAccountAuthenticatorService extends Service {
|
||||||
|
|
||||||
|
private static final String TAG = "AuthenticationService";
|
||||||
|
private final MyAccountAuthenticator authenticator = new MyAccountAuthenticator(this);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return authenticator.getIBinder();
|
||||||
|
}
|
||||||
|
}
|
||||||
18
apps/PushApiTestAppOne/Android.mk
Normal file
18
apps/PushApiTestAppOne/Android.mk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
# Only compile source java files in this apk.
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := PushApiTestAppOne
|
||||||
|
|
||||||
|
LOCAL_SDK_VERSION := current
|
||||||
|
|
||||||
|
LOCAL_DEX_PREOPT := false
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
|
||||||
|
# Use the following include to make our test apk.
|
||||||
|
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||||
37
apps/PushApiTestAppOne/AndroidManifest.xml
Normal file
37
apps/PushApiTestAppOne/AndroidManifest.xml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.example.android.pushapithirdpartyone">
|
||||||
|
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
|
||||||
|
<application android:label="3P App 1" android:icon="@drawable/push">
|
||||||
|
<activity android:name="MainActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<receiver android:name="com.example.android.pushapithirdpartyone.MessageReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.accounts.NEW_ACCOUNT_VISIBLE"/>
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.accounts.SupportedLoginTypes"
|
||||||
|
android:value="com.google;com.whatsapp;com.example.android.pushapiauthenticator" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
BIN
apps/PushApiTestAppOne/res/drawable/push.png
Normal file
BIN
apps/PushApiTestAppOne/res/drawable/push.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
92
apps/PushApiTestAppOne/res/layout/activity_main.xml
Normal file
92
apps/PushApiTestAppOne/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#ADD8E6"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:fillViewport="false">
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/relativelayout">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Test Application One"
|
||||||
|
android:id="@+id/testapponetext"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="27dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Visible Accounts"
|
||||||
|
android:id="@+id/visibleaccountstext"
|
||||||
|
android:layout_marginTop="58dp"
|
||||||
|
android:layout_below="@+id/testapponetext"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="----"
|
||||||
|
android:id="@+id/visibleaccounts"
|
||||||
|
android:layout_below="@+id/visibleaccountstext"
|
||||||
|
android:layout_alignLeft="@+id/visibleaccountstext"
|
||||||
|
android:layout_alignStart="@+id/visibleaccountstext" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
style="?android:attr/buttonStyleSmall"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Get!"
|
||||||
|
android:id="@+id/getvisibleaccounts"
|
||||||
|
android:layout_alignTop="@+id/visibleaccountstext"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentEnd="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="----"
|
||||||
|
android:id="@+id/logintypesregistered"
|
||||||
|
android:layout_below="@+id/logintypesregisteredtext"
|
||||||
|
android:layout_alignLeft="@+id/logintypesregisteredtext"
|
||||||
|
android:layout_alignStart="@+id/logintypesregisteredtext" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Accounts Registered to Support"
|
||||||
|
android:id="@+id/logintypesregisteredtext"
|
||||||
|
android:layout_marginTop="58dp"
|
||||||
|
android:layout_below="@+id/getvisibleaccounts" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapithirdpartyone;
|
||||||
|
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.accounts.AccountManager;
|
||||||
|
import android.accounts.AccountManagerCallback;
|
||||||
|
import android.accounts.AccountManagerFuture;
|
||||||
|
import android.accounts.AuthenticatorDescription;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import android.widget.ToggleButton;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
|
||||||
|
private static AccountManager am;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
am = AccountManager.get(getApplicationContext());
|
||||||
|
final TextView loginTypesRegistered = (TextView) findViewById(R.id.logintypesregistered);
|
||||||
|
final TextView visibleAccounts = (TextView) findViewById(R.id.visibleaccounts);
|
||||||
|
final Button getVisibleAccounts = (Button) findViewById(R.id.getvisibleaccounts);
|
||||||
|
final Toast notifOn = Toast.makeText(getApplicationContext(), "Notifs Turned On!",
|
||||||
|
Toast.LENGTH_SHORT);
|
||||||
|
final Toast notifOff = Toast.makeText(getApplicationContext(), "Notifs Turned Off!",
|
||||||
|
Toast.LENGTH_SHORT);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setMessage("Welcome to Test App 1.\nPlease make sure you have:\n\n1. Test App 2\n"
|
||||||
|
+ "\n2. Auth App \n\ninstalled for the demo. These applications together provide" +
|
||||||
|
" tests, use cases, and proof of concept of Push API!\n")
|
||||||
|
.setTitle("WELCOME")
|
||||||
|
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
String supportedPackages = "";
|
||||||
|
try{
|
||||||
|
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),
|
||||||
|
PackageManager.GET_META_DATA);
|
||||||
|
Bundle bundle = ai.metaData;
|
||||||
|
supportedPackages = bundle.getString("android.accounts.SupportedLoginTypes");
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
Log.e("PushApiTestAppOne", "Failed to load meta-data, NameNotFound: "
|
||||||
|
+ e.getMessage());
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
Log.e("PushApiTestAppOne", "Failed to load meta-data, NullPointer: " + e.getMessage());
|
||||||
|
}
|
||||||
|
String[] manifestSupportedAccountTypes = supportedPackages.split(";");
|
||||||
|
final StringBuilder masterString = new StringBuilder();
|
||||||
|
for (int i = 0 ; i < manifestSupportedAccountTypes.length ; i++) {
|
||||||
|
masterString.append(manifestSupportedAccountTypes[i] + "\n");
|
||||||
|
}
|
||||||
|
if (masterString.length() > 0) {
|
||||||
|
loginTypesRegistered.setText(masterString);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
loginTypesRegistered.setText("----");
|
||||||
|
}
|
||||||
|
|
||||||
|
getVisibleAccounts.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Account[] accountsAccessedByAuthApp = am.getAccounts();
|
||||||
|
StringBuilder masterString = new StringBuilder();
|
||||||
|
for (int i = 0 ; i < accountsAccessedByAuthApp.length ; i++) {
|
||||||
|
masterString.append(accountsAccessedByAuthApp[i].name + ", " +
|
||||||
|
accountsAccessedByAuthApp[i].type + "\n");
|
||||||
|
}
|
||||||
|
if (masterString.length() > 0) {
|
||||||
|
visibleAccounts.setText(masterString);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
visibleAccounts.setText("----");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapithirdpartyone;
|
||||||
|
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class MessageReceiver extends BroadcastReceiver{
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
Account account = (Account) intent.getParcelableExtra("android.accounts.KEY_ACCOUNT");
|
||||||
|
Toast.makeText(context, "Account " + account.name + " received by Test App 1",
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
18
apps/PushApiTestAppTwo/Android.mk
Normal file
18
apps/PushApiTestAppTwo/Android.mk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
# Only compile source java files in this apk.
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := PushApiTestAppTwo
|
||||||
|
|
||||||
|
LOCAL_SDK_VERSION := current
|
||||||
|
|
||||||
|
LOCAL_DEX_PREOPT := false
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
|
||||||
|
# Use the following include to make our test apk.
|
||||||
|
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||||
37
apps/PushApiTestAppTwo/AndroidManifest.xml
Normal file
37
apps/PushApiTestAppTwo/AndroidManifest.xml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.example.android.pushapithirdpartytwo">
|
||||||
|
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
|
||||||
|
<application android:label="3P App 2" android:icon="@drawable/push">
|
||||||
|
<activity android:name="MainActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<receiver android:name="com.example.android.pushapithirdpartytwo.MessageReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.accounts.NEW_ACCOUNT_VISIBLE"/>
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.accounts.SupportedLoginTypes"
|
||||||
|
android:value="com.google;com.whatsapp;com.example.android.pushapiauthenticator" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
BIN
apps/PushApiTestAppTwo/res/drawable/push.png
Normal file
BIN
apps/PushApiTestAppTwo/res/drawable/push.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
106
apps/PushApiTestAppTwo/res/layout/activity_main.xml
Normal file
106
apps/PushApiTestAppTwo/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#ADE6B4"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:fillViewport="false">
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:id="@+id/relativelayout">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="----"
|
||||||
|
android:id="@+id/logintypesregistered2"
|
||||||
|
android:layout_below="@+id/logintypesregisteredtext"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Accounts Registered to Support:"
|
||||||
|
android:id="@+id/logintypesregisteredtext"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_marginTop="34dp"
|
||||||
|
android:layout_below="@+id/placeholder" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Visible Accounts"
|
||||||
|
android:id="@+id/textView5"
|
||||||
|
android:layout_alignTop="@+id/getvisibleaccounts2"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:text="----"
|
||||||
|
android:id="@+id/visibleaccounts2"
|
||||||
|
android:layout_below="@+id/getvisibleaccounts2"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentStart="true" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/placeholder"
|
||||||
|
android:layout_alignRight="@+id/logintypesregistered2"
|
||||||
|
android:layout_alignEnd="@+id/logintypesregistered2"
|
||||||
|
android:layout_below="@+id/visibleaccounts2" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
style="?android:attr/buttonStyleSmall"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Get!"
|
||||||
|
android:id="@+id/getvisibleaccounts2"
|
||||||
|
android:layout_below="@+id/textView"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_marginTop="37dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
android:text="Test Application Two"
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_centerHorizontal="true" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapithirdpartytwo;
|
||||||
|
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.accounts.AccountManager;
|
||||||
|
import android.accounts.AccountManagerCallback;
|
||||||
|
import android.accounts.AccountManagerFuture;
|
||||||
|
import android.accounts.AuthenticatorDescription;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import android.widget.ToggleButton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A minimal "Hello, World!" application.
|
||||||
|
*/
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
/**
|
||||||
|
* Called with the activity is first created.
|
||||||
|
*/
|
||||||
|
private static AccountManager am;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
am = AccountManager.get(getApplicationContext());
|
||||||
|
final TextView loginTypesRegistered = (TextView) findViewById(R.id.logintypesregistered2);
|
||||||
|
final TextView visibleAccounts = (TextView) findViewById(R.id.visibleaccounts2);
|
||||||
|
final Button getVisibleAccounts = (Button) findViewById(R.id.getvisibleaccounts2);
|
||||||
|
final Toast notifOn = Toast.makeText(getApplicationContext(), "Notifs Turned On!",
|
||||||
|
Toast.LENGTH_SHORT);
|
||||||
|
final Toast notifOff = Toast.makeText(getApplicationContext(), "Notifs Turned Off!",
|
||||||
|
Toast.LENGTH_SHORT);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setMessage("Welcome to Test App 1.\nPlease make sure you have:\n\n1. Test App 1\n"
|
||||||
|
+ "\n2. Auth App \n\ninstalled for the demo. These applications together provide" +
|
||||||
|
" tests, use cases, and proof of concept of Push API!\n")
|
||||||
|
.setTitle("WELCOME")
|
||||||
|
.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
String supportedPackages = "";
|
||||||
|
try{
|
||||||
|
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(),
|
||||||
|
PackageManager.GET_META_DATA);
|
||||||
|
Bundle bundle = ai.metaData;
|
||||||
|
supportedPackages = bundle.getString("android.accounts.SupportedLoginTypes");
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
Log.e("PushApiTestAppTwo", "Failed to load meta-data, NameNotFound: "
|
||||||
|
+ e.getMessage());
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
Log.e("PushApiTestAppTwo", "Failed to load meta-data, NullPointer: " + e.getMessage());
|
||||||
|
}
|
||||||
|
String[] manifestSupportedAccountTypes = supportedPackages.split(";");
|
||||||
|
final StringBuilder masterString = new StringBuilder();
|
||||||
|
for (int i = 0 ; i < manifestSupportedAccountTypes.length ; i++) {
|
||||||
|
masterString.append(manifestSupportedAccountTypes[i] + "\n");
|
||||||
|
}
|
||||||
|
if (masterString.length() > 0) {
|
||||||
|
loginTypesRegistered.setText(masterString);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
loginTypesRegistered.setText("----");
|
||||||
|
}
|
||||||
|
getVisibleAccounts.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Account[] accountsAccessedByAuthApp = am.getAccounts();
|
||||||
|
StringBuilder masterString = new StringBuilder();
|
||||||
|
for (int i = 0 ; i < accountsAccessedByAuthApp.length ; i++) {
|
||||||
|
masterString.append(accountsAccessedByAuthApp[i].name + ", " +
|
||||||
|
accountsAccessedByAuthApp[i].type + "\n");
|
||||||
|
}
|
||||||
|
if (masterString.length() > 0) {
|
||||||
|
visibleAccounts.setText(masterString);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
visibleAccounts.setText("----");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 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.example.android.pushapithirdpartytwo;
|
||||||
|
|
||||||
|
import android.accounts.Account;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class MessageReceiver extends BroadcastReceiver{
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
Account account = (Account) intent.getParcelableExtra("android.accounts.KEY_ACCOUNT");
|
||||||
|
Toast.makeText(context, "Account " + account.name + " received by Test App 2",
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user